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 B并B A表示相同的比较,我想从数据集中删除这种冗余。最后的结果应该是
A B
A C
A D
B C
Run Code Online (Sandbox Code Playgroud)
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为重复。
在 Perl 中:
perl -lane 'print if !$seen{join(" ", sort @F)}++'
Run Code Online (Sandbox Code Playgroud)
这是通过对字段进行排序和连接(因此“CA”将成为键“AC”)并将它们添加到$seen. 它只会打印第一次出现,因为条件子句只有在计算为零时才会为真(由于后增量,这只会在第一次遇到此比较时发生)。