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

awk remove mirrored duplicates from 2 columns

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

示例数据:

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 被认为是一样的。有关如何执行此操作的任何建议?

在 awk 中:

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

解释:

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

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

惯用的 awk 方法是对索引部分进行排序:

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

另一个awk魔法

awk '!a[,] && !a[,]++' file