2016-09-10 75 views
0

該腳本從第一列中查找重複的條目,並從第二列中逐列打印條目。我想知道腳本如何實現這一點。有人可以解釋這個Awk腳本嗎?

awk '{c[$1]++; k[$1]=k[$1] " " $2} END {for (i in c) {if (c[i]>1) print k[i]}}' 
+0

您是否有示例數據? – dawg

回答

6
{ 
    c[$1]++    # count occurances of first field entries 
    k[$1]=k[$1] " " $2 # catenate second fields for recurring entries 
    # k[$1]=k[$1] $2 " " # this way output'd look better 
} 
END {     # after counting and catenating 
    for (i in c) {  # go thru all entries 
     if (c[i]>1)  # and print the catenated second fields for those 
      print k[i] # recurring first fields 
    } 
} 

例如:

key1 data1 
key1 data2 
key2 data3 

將產生輸出:

data1 data2 
+1

非常感謝!數組「c」存儲每個條目的出現次數。數組k存儲連接的字段。每個數組都按列1的條目編制索引。我的理解是否正確? – user39617

2

如果誰寫它剛剛使用有意義的變量名和縮進我敢打賭,你甚至不會不得不問:

awk ' 
{ 
    count[$1]++ 
    values[$1] = values[$1] " " $2 
} 
END { 
    for (key in count) { 
     if (count[key] > 1) { 
      print values[key] 
     } 
    } 
} 
' 

它可能已經與三元書面表達更好,因爲:

awk ' 
{ values[$1] = (count[$1]++ ? values[$1] " " : "") $2 } 
END { 
    for (key in count) { 
     if (count[key] > 1) { 
      print values[key] 
     } 
    } 
} 
' 

,以避免一個前導或尾隨空白,還有其他一些小的改進可太立。

相關問題