2017-04-23 121 views
-1

大问题: 我想要一个数据框中两个字段之间的唯一组合列表。awk从2列删除镜像副本

示例数据:

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被认为是一样的。有关如何做到这一点的任何建议?

+1

是否真实数据只有两个字符,也可以是两个以上的? –

+0

@George对不起,我没有指定 - 真正的数据是每列多个字符,但詹姆斯和埃德提供了适用于多个字符的答案 – user4670961

+1

我建议包括一个多字符样本输入/期望输出;是可能的一些解决方案打破多个字符... –

回答

3

惯用AWK的方法是安排索引部分:

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

是否将数组中的实际数据存储为只保留索引?在我看来,在看过的{next} $ 2 FS $ 1中看到{awk'$ 1 FS $ 2} {看过[$ 1 FS $ 2]} {'看过[1 $ FS $ 2]} 1'文件'会更容易记忆,尽管它还有更多码。 – ghoti

+1

'seen'将包含完全相同的值,无论是$ 1,$ 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)。

+0

@ghoti它是如何有用或建设性的取笑我?我只是在学习编码,并努力按照本网站概述的结构以有组织的方式提出问题。这是我正在研究的主要使用awk的更长时间问题的最后一步。如果你没有什么好说的话,请随时保留! – user4670961

+2

@EdMorton True,true。 –

+2

你在1之前的解决方案中忘记了'||'吗?你已经将它包含在你的解释中,但不包含在你的代码中。 –

3

另一awk魔术

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