我需要在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
任何帮助将不胜感激。
答案 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