awk从2列中删除镜像重复项

时间:2017-04-23 15:12:39

标签: awk uniq

大问题: 我想要一个数据框中两个字段之间唯一组合的列表。

示例数据:

A   B
C   D
E   F
B   A
C   F
E   F

我希望能够得到4种独特组合的结果:AB,CD,EF和CF.由于BA和BA包含相同的组件但顺序不同,我只想要一个副本(这是一个相互关系,所以BA与AB是一样的)

尝试:

到目前为止,我已尝试排序并保留唯一的行:

 sort file | uniq

但当然会产生5种组合:

A   B
C   D
E   F
B   A
C   F

我不知道如何将AB / BA视为同样的方法。有关如何做到这一点的任何建议吗?

3 个答案:

答案 0 :(得分:3)

惯用的awk方法是订购索引部分:

$ awk '!seen[$1>$2 ? $1 FS $2 : $2 FS $1]++' file
A   B
C   D
E   F
C   F

答案 1 :(得分:3)

另一个awk魔法

awk '!a[$1,$2] && !a[$2,$1]++' file

答案 2 :(得分:2)

在awk中:

$ awk '($1$2 in a){next}{a[$1$2];a[$2$1]}1' file
A   B
C   D
E   F
C   F

说明:

($1$2 in a) { next }     # if duplicate in hash, next record
{ a[$1$2]; a[$2$1] } 1   # hash reverse also and output

适用于单个字段。如果您想将其用于更长的字符串,请在字段之间添加FS,例如a[$1 FS $2]等。(感谢@EdMorton)。