"&&" AWK 编码中实际上意味着 AND 吗?



>我目前正在从大型数据文件中过滤出具有特定模式的行。因为行需要满足几个规则,所以我在awk中使用"&&"。但我的印象是它并不完全遵循逻辑 AND。

我的数据如下所示:

Group   EB1_D   EN1_D   EZ1_D   LB1_D   LN1_D   LZ1_D   MB1_D   MN1_D   MZ1_D   TB1_D   TN1_D   TZ1_D   AB1_D   AN1_D   AZ1_D
OG0008871:Down  0.886835651 NA  0.205991042 0.344286962 NA  0.212469765 0.934134739 NA  NA  0.087171422 0.144711362 0.002778751 NA  NA  NA
OG0021381:Down  0.65178744  0.000508521 0.477039947 NA  NA  NA  NA  NA  0.826395809 NA  NA  NA  NA  NA  NA
OG0011803:Up    NA  NA  NA  NA  NA  0.00734476  NA  NA  NA  0.458883104 NA  NA  NA  NA  NA
OG0015725:Up    NA  NA  NA  NA  0.858766006 NA  NA  NA  NA  0.376378076 0.196034543 0.329094645 0.062600211 0.080328374 0.017079806

我想过滤掉B1_D大于任何其他值的所有行,所以我使用以下(可能不是最实用的,但它无论如何都应该有效:

awk '$2 > $3 && $2 > $6 && $2 > $7 && $2 > $4 && $2 > $9 && $2 > $10 && $2 > $12 && $2 > $13 && $2 > $15 && $2 > $16 && $5 > $3 && $5 > $6 && $5 > $7 && $5 > $4 && $5 > $9 && $5 > $10 && $5 > $12 && $5 > $13 && $5 > $15 && $5 > $16 && $8 > $3 && $8 > $6 && $8 > $7 && $8 > $4 && $8 > $9 && $8 > $10 && $8 > $12 && $8 > $13 && $8 > $15 && $8 > $16 && $11 > $3 && $11 > $6 && $11 > $7 && $11 > $4 && $11 > $9 && $11 > $10 && $11 > $12 && $11 > $13 && $11 > $15 && $11 > $16 && $14 > $3 && $14 > $6 && $14 > $7 && $14 > $4 && $14 > $9 && $14 > $10 && $14 > $12 && $14 > $13 && $14 > $15 && $14 > $16 END {print $0}'

应用此值仅提供行 OG0015725:UP 作为输出 但是: 其中一条规则是 11 美元> 6 美元。$11 的值是 0.376378076,$6 的值是 0.858766006。

因此,它不应该被选中,但它确实被选中了。我是否错误地应用了此代码? 奇怪的是OG0015725:UP是输入文件的最后一行,并在我所有不同的输出文件中被选中!

提前感谢您的任何输入。

是的,&&表示 AND 在 awk 条件评估中。

您没有正确使用它,您应该执行以下操作:

awk '$1>$2 && $2 > $4{ some action }...' input

您拥有的:

awk '$1>$2 && $2 > $4 END{.action...}' input

如果要使用简短的方法检查和打印当前行:

awk '$1>$2 && $2 > $4; END{...}' input

顺便说一句,一定有更好的方法来检查你的呜呜呜检查。

这是比编写链$1>$2 && $1>$3 && $1>$4更好的方法

awk 'function max(x,y) { return x>y?x:y }
function maxof(xs) { n=split(xs,a); m=a[1]; for(i=2;i<=n;i++) m=max(m,a[i]); return m}
$1 > maxof($2 FS $3 FS $4) {...'

x>y && x>z <=> x > max(y,z)起有效

最新更新