2016-03-24 59 views
1

我想寫一個awk腳本摺疊相同的行(由幾列定義),並保持具有最小值的整個行。awk代碼摺疊行,並保持整行基於一列的值

這是我的示例性輸入:

A  20 30  Boston  US  3  tempCity  top 
A  20 30  London  UK  2  coldCity  top 
A  20 30  Singapore  SG  4  hotCity  top 
B  10 20  Tokyo  JP  3  coldCity  mid 

我想只保留一個行與第六列的最小值,如果第一,第二,第三和第八列是相同的。這是我的預期輸出:

A  20 30  London  UK  2  coldCity  top 
B  10 20  Tokyo  JP  3  coldCity  mid 

我試圖寫這樣的代碼:

awk -v OFS='\t' '{par=$1 OFS $2 OFS $3 OFS $8} $6<a[par]{a[par]=(par in a)?a[par]$0:$0} END {for (i in a) print i, a[i]}' cityList.txt 

,但我只得到了以下的輸出:

A  20  30  top 
B  10  20  mid  

我在AWK一個新手,所以任何幫助非常感謝!提前致謝!

回答

1

你快到了!

awk -v OFS='\t' '!a[$1,$2,$3,$8] || $6 < a[$1,$2,$3,$8] { a[$1,$2,$3,$8] = $0 } END {for (i in a) print a[i]}' file 

我改變在陣列0​​在設定值的條件,這樣,當鑰匙沒有定義或者值小於當前鍵它的設置。

我已經選擇在任何地方使用$1,$2,$3,$8 - 如果您想避免重複,可以使用$1 SUBSEP $2 SUBSEP $3 SUBSEP $8設置一個等於此值的變量。 SUBSEP是一個控制字符,它不太可能與密鑰的內容衝突。

END塊中的循環僅打印存儲在a[i]中的行,而不是連接您試圖執行的密鑰。

+0

你好Tom!非常感謝!它解決了我的問題,我也學到了新的東西。 – kaka01

0

替代awk,也許更容易閱讀和

$ sort -k6,6n cities | sort -u -k1,3 -k8 

A  20 30  London  UK  2  coldCity  top 
B  10 20  Tokyo  JP  3  coldCity  mid