使用shell命令可以把數據文件進行像excel表格一樣的操作,不僅占用內存小,而且在很多功能方面更是實力碾壓excel,非常方便。
常用的命令有
(1)awk / sed 命令用於對特定行列進行操作
(2)cat / head / tail 命令用於在終端打印查看數據
(3)sort / grep 排序和篩選函數
(4)此外還常用管道和重定向命令
常用的循環結構有
(1)while型循環
while condition;do
command #此處寫具體命令
done
(2)for循環
for (( i=0 ; i<199 ; ++i )) ; do #注意用分號隔開,雙層括號,元素從0開始取,即數組索引類似python
command #此處寫具體命令
done
下面展示幾個例子:
例子1:求最值(文件第4列元素的最大值和最小值)
找出最小值的命令 "sort -n -k4 | head -n1"
找出最大值的命令 "sort -n -k4 | tail -n1"
sort選項說明:
sort -r 默認的排序方式是升序,加個-r就改成降序,需要注意-r生成的序列不支持重定向>
sort -n 默認的排序方式是字符排序,-n選項可以告訴sort要以數值來排序
sort -t 默認的間隔符為空格,-t選項后面可以設定間隔符,比如 “#”,“-”,“:” ,“_”等等
sort -k 默認的按照首列排序,-k后按照指定列數排序
sort input.txt -o output.txt 標准輸入/出到文件,比重定向更好,-o常常與-r搭配使用。
sort -u 去除重復行
例子2:去重復值(從cataloge_ray數據的第四列的幾百萬數據中讀取互不重復的199個值,並排序后寫入新文件cataloge_sta_aviable.txt中)
代碼一行即可
cat cataloge_ray | awk '!a[$4]++' | sort -n -k4 | awk '{print $4}' > cataloge_sta_aviable.txt
該命令可以將射線目錄中的台站編號找出。(cataloge_ray共5列,$1是地震射線編號,$2是地震編號,$3到時編號,$4台站編號,$5波型;cataloge_sta_aviable.txt只有1列,將台站編號不重復,排好序,打印出來)
一個神奇的命令 awk '!a[$4]++' 它可以幫助我們在一個序列中去掉重復的值。
awk '!a[$4]++'這是一個非常經典的去重復項的awk語句,雖然短小,不過涉及到了不少知識點,下面一一解讀:
<1>:”!” 即非。
<2>:a[$0],以$0為數據下標,建立數組a
<3>:a[$0]++,即給數組a賦值,a[$0]+=1
當$0的內容首次出現時,a[$0]將為空(相當於0)。
此時將先求!a[$0]的值(也是整個式子的值,即為非空 true ,將影響后續動作,執行默認的print)。
然后對a[$0]進行+1,a[$0] 加1后為1,當下次出現時a[$0]即不為空,表達式結果為非真 false,即不打印。
例子3:篩選特定行數的值(文件cataloge_sta_aviable.txt表示有效台站的序號,將這些序號的台站從stajp287文件中摘出來,並寫入cataloge_sta文件)
代碼如下
1 #篩選出有效的台站目錄 2 line=($(awk '{print $0}' cataloge_sta_aviable.txt)) 3 for ((i=0;i<199;++i)) 4 do 5 cat stajp287 | awk 'NR=='${line[$i]}' {print $2,$1,$3}' >> cataloge_sta 6 done
該過程的難點在於:
(1)將文件內容變為數組line需要在賦值之前加“()”括號
(2)awk篩選出的內容需要用$()進行變量化
(3)逐行篩選符合要求的台站,其中NR表示行數,$1表示列數。$0表示全部
(4)在應用數組的時候需要加括號$(list[0])表示第一個元素。
(5)shell數組的第一個元素索引是0,類似python
