从输出列中删除冗余

从输出列中删除冗余

在我在两列中进行像这样的成对比较的情况下,消除冗余的 *NIX 方法是什么

    A B
    B A
    A C
    A D
    C A
    D A 
    B C
    C B

A BB A表示相同的比较,我想从数据集中删除此类冗余。最终结果应该是

A B
A C
A D
B C

答案1

doit () 
{ 
    awk '{
           key=$1<=$2? $1 FS $2 : $2 FS $1; 
           if (!seen[key]) print $1,$2
           seen[key]=1
    }'
}
$ doit <test
A B
A C
A D
B C
$

(或者,变得更简洁,因为克里斯唐的回答是如此甜蜜)

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++ {print $1,$2}'

如果您不关心数据中的空格,则可以进一步减少

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++'

FS是 awk 的“字段分隔符”变量,在这里用于保证关键字段之间的边界能够被正确识别。我的原作让它们一起运行,$1$2正如 Stephane Chazelas 指出的那样,它将把A BCAB C视为重复项。

答案2

在 Perl 中:

perl -lane 'print if !$seen{join(" ", sort @F)}++'

这是通过对字段进行排序和连接(因此“C A”将成为键“A C”)并将它们添加到$seen.它只会打印第一次出现的情况,因为条件子句仅在其计算结果为零时才为真(由于后增量,这只会在第一次遇到此比较时发生)。

答案3

如果您不介意保留唯一行上元素的顺序,那么您可以对每一行进行排序,然后对行进行排序并删除重复项。

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

相关内容