用awk找到一行中的差异

时间:2013-04-23 22:17:58

标签: awk

我有一张表,其中给定行中的大多数值都相同。我想要提取的是任何行,其中至少有一个值是不同的。我已经想出了如何用这样的东西做到这一点

awk -F "\t" '{if (($4!=$5)&&($5!=$6)&&($6!=$7)) print $0;}'

唯一的问题是有40个奇数列要比较。是否有更优雅的方法来比较多个列的差异。顺便说一句 - 这些是非数值,所以花哨的数学技巧不会起作用。

全部谢谢。我是新手,所以我不得不承认我不理解所有命令等,但我可以从这里查看。我不确定我的建议是什么,但我从具体的例子中学到的东西比从课本解释中学到的更多,所以有了这些不同的解决方案对我的学习曲线有很大的帮助。

3 个答案:

答案 0 :(得分:6)

一个花哨的数学技巧可能不起作用,但如何:

$ cat file
one one one one two
two two two two two
three four four five

$ awk '{f=$0;gsub($1,"")}NF{print f}' file 
one one one one two
three four four five

首先我们将行存储在原始状态f=$0中,然后我们对与第一个字段匹配的所有内容进行全局替换,如果所有字段都相同,那么NF将不会留下任何内容,并且什么都不打印,否则我们打印原始行。

您的脚本从$4开始,这表示您只对此字段中的更改感兴趣,在这种情况下:

$ awk '{f=$0;gsub($4,"")}NF>3{print f}' file 

答案 1 :(得分:0)

您可以使用for循环:

awk -F "\t" '{ for(i=4;i<NF;i++) if ($i != $(i+1)) { print; next } }' file

相应调整。 HTH。

答案 2 :(得分:0)

如果任何字段与其他字段不同,则它与字段1不同,或者字段1与其他字段不同(根据定义)。因此,只需从2循环到NF(字段数),将其与所有其他字段进行比较:

awk -F "\t" '{ for (i = 2; i <= NF ;i++) if ($i != $1) { print; next; }}'

您可以根据需要调整此选项以忽略前导字段(例如,从5开始并与$ 4比较)。