【问题标题】:Can someone please explain this Awk script?有人可以解释一下这个 awk 脚本吗?
【发布时间】: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]}}'

【问题讨论】:

  • 你有示例数据吗?

标签: bash awk gawk


【解决方案1】:
{
    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 列的条目索引。我的理解正确吗?
【解决方案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]
        }
    }
}
'

为了避免出现前导或尾随空白,还可以进行一些其他小的改进。

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2013-02-27
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多