【问题标题】:awk - Find duplicate entries in 2 columns, keep 1 duplicate and unique entriesawk - 在 2 列中查找重复条目,保留 1 个重复且唯一的条目
【发布时间】:2016-12-08 21:42:50
【问题描述】:

我需要在 2 个不同的列中找到一个重复条目,并且只保留一个重复条目和所有唯一条目。对我来说,如果 A123 在第一列中并且稍后在第二列中显示,则它是重复的。我也确定 A123 将始终通过 A123、B123 或 B123、A123 与 B123 配对。我只需要保留一个,不管是哪一个。

例如:我的输入文件将包含:
A123,B123
A234,B234
C123,D123
B123,A123
B234,A234

我希望输出为:
A123,B123
A234,B234
C123,D123

我能做的最好的就是提取唯一的条目:

awk -F',' 'NR==FNR{x[$1]++;next}; !x[$2]' file1 file1

或仅获取重复项

awk -F',' 'NR==FNR{x[$1]++;next}; x[$2]' file1 file1


任何帮助将不胜感激。

【问题讨论】:

    标签: unix awk solaris


    【解决方案1】:

    这可以更短!

    如果元素尚未出现在数组中,则首先打印。然后将第一个字段添加到数组中。只需对输入文件运行一次:

    awk -F, '!x[$2];{x[$1]++}' file1
    

    【讨论】:

    • 工作得很好!谢谢!
    • 请注意,它仅适用于您的独特要求,即每 2 美元与特定的 1 美元配对。它不适用于在一对字段中查找唯一条目的一般情况,因为它从未记录见过 $2,也不适用于字段的唯一组合。
    【解决方案2】:

    这个 awk 单行代码适用于您的示例:

    awk -F, '!($2 in a){a[$1]=$0}END{for(x in a)print a[x]}' file
    

    【讨论】:

    • 更长,让我更好地了解 awk 的工作原理。谢谢!
    【解决方案3】:

    传统的惯用 awk 解决方案:

    $ awk -F, '!seen[$1>$2 ? $1 : $2]++' file
    A123,B123
    A234,B234
    C123,D123
    

    按照惯例,我们总是使用seen(而不是x或其他任何东西)作为数组名称,当它表示您想要检查它的索引是否以前见过的集合时,并使用三元表达式生成作为索引的最大可能键值确保它们在输入中出现的顺序无关紧要。

    以上内容并不关心您的独特情况,即每个 $2 都与特定的 $1 配对 - 它只是在一对字段中打印唯一的个别事件。如果您希望它在组合的字段对上工作(并假设您有更多字段,因此仅使用 $0 作为索引是行不通的),那就是:

    awk -F, '!seen[$1>$2 ? $1 FS $2 : $2 FS $1]++' file
    

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2015-11-22
      • 1970-01-01
      • 2021-09-19
      相关资源
      最近更新 更多