2016-12-06 36 views
0

我输入的性质如下查找一个文件的不同列重复

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 }' 

,但没有奏效

回答

4

这AWK一衬垫做的:

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

随着你的例子作为输入,其输出:

6789mmm mddyss skjhude 
khora77 koemm sado666 

它建立一个散列表(AWK阵列),关键是在一个每场行。最后,我们比较哈希表的大小,如果它与字段数相同,我们知道没有重复项,然后将其打印出来。

它也可以工作,如果你的文件有100列,你不必做$1==$2 || .....$1==$100检查。

+0

''^为一个优雅的用法,用循环直到'NF' – Inian

+2

性能选择器挣扎,我们可以检查循环中散列表中是否已经存在密钥,如果文件中有大量的行和列,这种方式可能会更快。但是我认为对于正常使用情况,发布的答案已足够。 @Inian – Kent

1

在你的具体的例子,你可以做一些简单的像这样:

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

输出:

6789mmm mddyss skjhude 
khora77 koemm sado666 
+0

不是一个通用的解决方案!不超过3列的比例! – Inian

+0

@Inian YAGNI,我没有看到他想要一些通用的问题。 – dood

+0

@Inian同意,谢谢。 – dood

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 

编辑:显然相当一致@肯特的解决方案,但我的可能是一点点更有效。 :d

EDIT2:......显然他mentiones在他的评论一加速...