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

Awk 在文件的不同列中查找重复项,awk,gawk,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 }' 但它不起作用这个awk一号班

我的意见的性质如下

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

但它不起作用

这个awk一号班轮可以:

awk '{delete a;for(i=1;i<=NF;i++)a[$i]}length(a)==NF' file
它构建一个哈希表(awk数组),键是一行中的每个字段。最后我们比较哈希表的大小,如果它与字段的数量相同,我们知道没有重复项,然后打印出来


如果您的文件有100列,它也可以工作,您不必执行
$1==$2 | | |……$1==$100
检查。

此awk单行程序可以:

awk '{delete a;for(i=1;i<=NF;i++)a[$i]}length(a)==NF' file
它构建一个哈希表(awk数组),键是一行中的每个字段。最后我们比较哈希表的大小,如果它与字段的数量相同,我们知道没有重复项,然后打印出来


如果您的文件有100列,它也可以工作,您不必执行
$1==$2 | | |……$1==$100
检查。

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

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

6789mmm mddyss skjhude
khora77 koemm  sado666

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

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

6789mmm mddyss skjhude
khora77 koemm  sado666

检查每个字段和递增计数器。如果记录上有匹配项,则跳到下一个记录。否则,
打印

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


编辑2:。。。显然,他在评论中提到了加速…

遍历每个字段并增加计数器。如果记录上有匹配项,则跳到下一个记录。否则,
打印

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


编辑2:。。。显然,他在评论中提到了加速…

不是通用的解决方案!不能缩放超过3列@伊尼安·雅格尼,我在问题中没有看到他想要一些通用的东西。@dood你的代码可以这样写:
awk'$1!=$2 && $1 != $3 && $2 != $3'文件
不是通用解决方案!不能缩放超过3列@伊尼安·雅格尼,我在问题中没有看到他想要一些通用的东西。@dood你的代码可以这样写:
awk'$1!=$2 && $1 != $3 && $2 != $3'文件
^
为了优雅的使用,正在与循环斗争,直到
NF
对于性能选择器,我们可以检查循环中哈希表中是否已经存在键,如果文件有大量的列和行,这种方法可以更快。然而,我认为对于正常用例,发布的答案就足够了@在Inian
^
中,为了优雅的使用,我们一直在努力使用循环,直到
NF
对于性能选择器,我们可以检查循环中哈希表中是否已经存在键,如果文件有大量的列和行,这种方法可能会更快。然而,我认为对于正常用例,发布的答案就足够了@伊尼亚人