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
大问题: 我想要一个数据框中两个字段之间的唯一组合的列表。
示例数据:
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