【发布时间】:2016-09-11 17:08:10
【问题描述】:
此脚本从第一列中查找重复条目并打印第二列组中的条目。我想知道脚本是如何实现这一点的。
awk '{c[$1]++; k[$1]=k[$1] " " $2} END {for (i in c) {if (c[i]>1) print k[i]}}'
【问题讨论】:
-
你有示例数据吗?
此脚本从第一列中查找重复条目并打印第二列组中的条目。我想知道脚本是如何实现这一点的。
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
【讨论】:
如果编写它的人只是使用了有意义的变量名和缩进,我敢打赌你甚至不必问:
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]
}
}
}
'
为了避免出现前导或尾随空白,还可以进行一些其他小的改进。
【讨论】: