2017-03-22 131 views
-3

我是新來這個網站並試圖學習awk。我試圖找到字段5的最大值,通過多年的分組,並且還個月..使用awk通過groupby提取最大值和最小值

爲每月(每年),印刷正好符合概率最大

輸入文件: (逗號分隔)

year,month,lat,lng,probability 
0,0,40,331,1.00000  
0,2,38,334,0.01111 
0,2,38,334,0.05511 
0,4,38,335,0.06667 
0,8,38,336,0.16667 
1,2,39,334,0.12222 
1,2,39,335,0.04444 
1,4,39,336,0.02222 
1,4,40,333,0.14444 
1,4,40,334,0.12222 
2,6,40,335,0.06667 
2,6,40,336,0.14444 

輸出文件所需

months,lat,lng 
2,38,334 
4,38,335 
8,38,336 
14,40,333 
16,40,336 

謝謝大家的幫助

+2

的StackOverflow是沒有劇本的寫作服務。請顯示你試過的東西 –

+0

我只需要有人來指導我,我從來沒有要求完整的腳本 我的問題是,我不能寫這兩個組的腳本,按年份和按月份,我做了很多在互聯網上的研究,但沒有結果 – Walidou

+0

錯誤發生 - 我們理解.....向我們展示你的嘗試,無論腳本作品不好 –

回答

1

您的示例中存在不一致。如果按「組」,則表示由$1,$2定義的組需要有多個條目,這就解釋了爲什麼不包含0,40,331。但爲什麼包含4,38,335

無論如何,你問一個開始,在這裏,它是:

$ awk 'BEGIN{FS=OFS=","} 
     NR==1{print $2,$3,$4; next} 
     NR==FNR && FNR>1 { 
      if ($5>max[$1 OFS $2]) max[$1 OFS $2]=$5 
      next 
     } 
     max[$1 OFS $2]==$5 { print $1*12+$2,$3,$4} 
' file file 

打印:

month,lat,lng 
0,40,331 
2,38,334 
4,38,335 
8,38,336 
14,39,334 
16,40,333 
30,40,336 

發現腳本遍歷文件兩次(通過使用file兩次命令線)。第一次是找到由$1,$2定義的組的最大值,並第二次打印該行。

如果你只是想包括,盡數:

$ awk 'BEGIN{FS=OFS=","} 
     NR==1{print $2,$3,$4; next} 
     NR==FNR && FNR>1 { 
      cnt[$1 OFS $2]++ 
      if ($5>max[$1 OFS $2]) max[$1 OFS $2]=$5 
      next 
     } 
     max[$1 OFS $2]==$5 && cnt[$1 OFS $2]>1 { print $1*12+$2,$3,$4} 
' file file 

month,lat,lng 
2,38,334 
14,39,334 
16,40,333 
30,40,336 

我承認,比你的例子不同,但我認爲你的例子就需要更多的解釋。

+0

非常感謝你這真的很有幫助對我來說! 我承認我的例子並不是很明確,這是我第一次在這裏使用stackoverflow,我不知道它究竟是如何工作的! 你的腳本的第一個輸出是我試圖找到的,我試過你的代碼,沒有爲我工作,我得到的結果只有「month lat lng」而不是其他行 但代碼對我很有幫助,因爲我終於將代碼轉換成了第一個和第二個字段,並且我認爲我可以通過它再次完成代碼的其餘部分 再次感謝@dawg – Walidou

0

謝謝大家,也謝謝@dawg的幫助

我想給我的最終代碼反饋:

#!/bin/bash 
awk 'BEGIN{FS=OFS=","} 
     NR==1{print "months",$3,$4; next} 
     NR==FNR && FNR>1 { 
      if ($5>max[$1,$2]) 
     max[$1,$2]=$5 
       next 
     } 

     {if (max[$1,$2] == $5) 
     print $1*12+$2,$3,$4;}' example.csv example.csv `