从输出列中删除冗余

eas*_*fri 5 awk shell-script text-processing

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

    A B
    B A
    A C
    A D
    C A
    D A 
    B C
    C B
Run Code Online (Sandbox Code Playgroud)

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

A B
A C
A D
B C
Run Code Online (Sandbox Code Playgroud)

jth*_*ill 7

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

(或者,变得更简洁,因为 Chris Down 的回答太甜了)

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++ {print $1,$2}'
Run Code Online (Sandbox Code Playgroud)

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

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++'
Run Code Online (Sandbox Code Playgroud)

)

FS是awk的“字段分隔符”变量,这里用来保证边界之间的键字段将被正确识别。我原来有他们一起跑,$1$2,这是斯特凡Chazelas指出会处理A BC,并AB C为重复。


Chr*_*own 5

在 Perl 中:

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

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