我有一个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脚本来执行我之后的那种过滤,但我想看看是否有一个更简单的终端命令可以完成相同的操作。
答案 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