awk - 在2列中查找重复条目,保留1个重复和唯一条目

时间:2016-12-08 21:42:51

标签: unix awk solaris

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

Ex:我的输入文件包含:
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


任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

这可以更短!

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

传统的,惯用的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