2

我有一个 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 脚本来执行我所追求的那种过滤,但我想看看是否有一个更简单的终端命令可以做到这一点。

4

2 回答 2

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.

总而言之:

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

于 2013-01-05T05:52:17.610 回答
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
于 2016-04-15T17:12:47.257 回答