【问题标题】:awk code to collapse rows and keep the whole line based on one column's valueawk 代码折叠行并根据一列的值保留整行
【发布时间】:2016-07-11 21:35:38
【问题描述】:

我正在尝试编写一个 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 的新手,非常感谢任何帮助!提前致谢!

【问题讨论】:

    标签: bash unix 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
    

    我更改了在数组a 中设置值的条件,以便在未定义键或值小于当前键时设置它。

    我选择在任何地方使用$1,$2,$3,$8 - 如果您想避免重复,您可以使用$1 SUBSEP $2 SUBSEP $3 SUBSEP $8 设置一个与此相等的变量。 SUBSEP 是一个控制字符,不太可能与键的内容发生冲突。

    END 块中的循环仅打印出存储在 a[i] 中的行,而不是连接您尝试执行的键。

    【讨论】:

    • 嗨,汤姆!非常感谢!它解决了我的问题,我也学到了一些新东西。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 2021-09-14
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多