2

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

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

唯一的问题是要比较 40 个奇怪的列。有没有更优雅的方法来比较多列的差异。顺便说一句——这些都是非数值,所以花哨的数学技巧是行不通的。

谢谢大家。我是新手,所以我不得不承认我不理解所有的命令等,但我可以从这里查到。不确定我会接受谁的建议,但我从具体示例中学到的知识比从教科书解释中学到的更多,因此拥有这些不同的解决方案对我的学习曲线有很大帮助。

4

3 回答 3

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将为 0 并且不会打印任何内容,否则我们打印原始行。

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

$ awk '{f=$0;gsub($4,"")}NF>3{print f}' file 
于 2013-04-23T22:39:32.657 回答
0

你可以只使用一个for循环:

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

相应调整。HTH。

于 2013-04-23T22:28:39.670 回答
0

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

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

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

于 2013-04-23T22:30:40.873 回答