shell處理數據:求最值,去重復值,篩選指定行數的值


使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM