【问题标题】:Unix bash: select rows with unique value in one column, based on value of another columnUnix bash:根据另一列的值选择一列中具有唯一值的行
【发布时间】:2018-01-31 03:37:07
【问题描述】:

我有一个包含两列的文件,看起来像这样:

1 3
1 4
2 3
3 3
4 3
4 4

我想把它做成一个文件,在第一列中具有唯一值,并且重复的行只保留第二列中具有最大值的行,所以新文件如下所示:

1 4
2 3
3 3
4 4

关于如何使用 bash/awk/etc 实现这一点的任何想法?

【问题讨论】:

    标签: bash awk unique


    【解决方案1】:

    使用awk,您可以使用关联数组进行管理,该数组将键作为第 1 列,值作为第 2 列的最大值:

    awk '$2 > a[$1]{a[$1] = $2} END{for (i in a) print i, a[i]}' file
    
    1 4
    2 3
    3 3
    4 4
    

    【讨论】:

    • 这太棒了,它有效!不幸的是,我不太明白……如果我有三列,我想根据前两列的组合选择唯一的行,然后根据第三列的最大值选择它们怎么办?可以修改这个 awk 命令来做到这一点吗?
    • 是的,可以做到。 awk '$3 > a[$1,$2]{a[$1,$2] = $3} END{for (i in a) print i, a[i]}' file
    • 如果要打印索引,您可能需要使用a[$1 FS $2] 而不是a[$1,$2]
    【解决方案2】:

    您能否尝试关注并告诉我这是否对您有帮助,它会为您提供仅 1 美元的最新值以及与 Input_file 的 1 美元相同的顺序的非重复值。

    awk '!a[$1]{b[++i]=$1} {a[$1]=$0;} END{for(j=1;j<=i;j++){print a[b[j]]}}'  Input_file
    

    【讨论】:

      【解决方案3】:

      只需使用sort:

      sort -k2,2rn file|sort -uk1,1n
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多