在我在两列中进行像这样的成对比较的情况下,消除冗余的 *NIX 方法是什么
A B
B A
A C
A D
C A
D A
B C
C B
A B
并B 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 BC
和AB 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