使用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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/19457.html
標籤:Linux
