該腳本從第一列中查找重複的條目,並從第二列中逐列打印條目。我想知道腳本如何實現這一點。有人可以解釋這個Awk腳本嗎?
awk '{c[$1]++; k[$1]=k[$1] " " $2} END {for (i in c) {if (c[i]>1) print k[i]}}'
該腳本從第一列中查找重複的條目,並從第二列中逐列打印條目。我想知道腳本如何實現這一點。有人可以解釋這個Awk腳本嗎?
awk '{c[$1]++; k[$1]=k[$1] " " $2} END {for (i in c) {if (c[i]>1) print k[i]}}'
{
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
非常感謝!數組「c」存儲每個條目的出現次數。數組k存儲連接的字段。每個數組都按列1的條目編制索引。我的理解是否正確? – user39617
如果誰寫它剛剛使用有意義的變量名和縮進我敢打賭,你甚至不會不得不問:
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]
}
}
}
'
,以避免一個前導或尾隨空白,還有其他一些小的改進可太立。
您是否有示例數據? – dawg