终端命令找到顺序无关紧要的唯一对

时间:2013-01-05 05:35:04

标签: command-line awk terminal filtering

我有一个Python脚本my_script.py,它生成两个元素之间以制表符分隔的配对列表,每行一个:

$ python my_script.py
cat dog
dog wolf
cat dog
pig chicken
dog cat

我希望将此脚本的输出传递到某种终端命令,我想过滤掉重复的组合,而不仅仅是重复排列。对于重复排列,我可以使用类似的东西:

$ python my_script.py | sort | uniq
cat dog
dog cat
dog wolf
pig chicken

删除重复的“猫狗”。 这种方法的问题在于我留下了“猫狗”和“狗猫”,为了我的目的,我应该将它们视为相同(相同的组合)。我知道我可以编写另一个非常简单的Python脚本来执行我之后的那种过滤,但我想看看是否有一个更简单的终端命令可以完成相同的操作。

2 个答案:

答案 0 :(得分:4)

这是使用awk的一种方式:

... | awk -F "\t" '!a[$1,$2]++ && !a[$2,$1]++'

结果:

cat dog
dog wolf
pig chicken

说明:

-F "\t"           # sets the field (column) separator to a single tab character

!a[$1,$2]++       # adds column one and column two to a pseudo-multidimensional
                  # array if they haven't already been added to the array

!a[$2,$1]++       # does the same thing, but adds the columns in the opposite
                  # orientation.
  

完全放弃:

     

因此,对于每一行输入,当且仅当前两个字段(在任一方向上)不存在于数组中时,才会打印该行。您可以阅读有关如何模拟多维数组here的更多信息。

答案 1 :(得分:0)

注意:上面的脚本不能为$ 1 == $ 2的情况提供任何输出。可以通过以下方式进行测试:

echo "dog dog" | awk '!a[$1,$2]++ && !a[$2,$1]++'|wc -l

请改为尝试:

|awk '{if($1<$2)print $1,$2; else print $2,$1}'|sort|uniq