在文件的不同列中查找重复项

时间:2016-12-06 14:58:18

标签: awk gawk

我输入的性质如下

1234jjj hdhyvb 1234jjj
6789mmm mddyss skjhude
khora77 koemm  sado666
nn1004  nn1004 457fffy

如果列中有重复项,我想删除一行,例如在第一行和最后一行有重复项,因此在输出中删除

6789mmm mddyss skjhude
khora77 koemm  sado666

我试过

awk '$1!=$2 || $1!=$3 { print $0 }' 

但它无效

3 个答案:

答案 0 :(得分:4)

这个awk one-liner做到了:

awk '{delete a;for(i=1;i<=NF;i++)a[$i]}length(a)==NF' file

以您的示例作为输入,输出:

6789mmm mddyss skjhude
khora77 koemm  sado666

它构建一个哈希表(awk数组),key是连续的每个字段。最后我们比较哈希表的大小,如果它与字段数相同,我们知道没有重复项,然后将其打印出来。

如果您的文件有100列,那么它也可以正常工作,您无需进行$1==$2 || .....$1==$100检查。

答案 1 :(得分:1)

在您的特定示例中,您可以执行以下简单操作:

awk ' $1 != $2 && $1 != $3 && $2 != $3 ' input.txt

输出:

6789mmm mddyss skjhude
khora77 koemm  sado666

答案 2 :(得分:0)

通过每个领域并增加计数器。如果记录中存在匹配,则跳至next记录。否则print

$ awk '{ delete a; for(i=1;i<=NF;i++) if(++a[$i]>1) next; print }' foo
6789mmm mddyss skjhude
khora77 koemm  sado666
编辑:显然与@ Kent的解决方案完全相同,但我的效率可能更高一些。 :d

EDIT2:......显然他在评论中提到加速......