如果列小于值替换其他列值 awk

If column less than value replace other column values awk

如果某个查询列低于某个值,我想替换多个列值。

示例文件测试:

cat test
OTU Phy P.conf Class C.conf Ord ord.conf Spec S.conf    
1 Mollusca 90 Bivalvia 80 Venerida 80 Rangia 80
2 Chordata 88 Fish 20  Salmon 0 pink 0 
3 Cnidaria 100 Coral 78 fire 22 octo 12

基本上,如果置信度值低于某个值,我想将分类名称设为“NA”。

我试过这个:

cat test | awk ' <90 {="NA"}1'
OTU Phy P.conf Class C.conf Ord ord.conf Spec S.conf    
1 Mollusca 90 Bivalvia 80 Venerida 80 Rangia 80
2 NA 88 Fish 20 Salmon 0 pink 0
3 Cnidaria 100 Coral 78 fire 22 octo 12

将第 2 行的 Phylum 名称(Phy 列)更改为 NA,因为 Phy 置信度列(第 3 列)低于 90。

我想做的是,如果第 3 列中的值低于 90,那么我想将右侧的其他列(较低的分类级别)也更改为 NA:例如

OTU Phy P.conf Class C.conf Ord ord.conf Spec S.conf    
1 Mollusca 90 Bivalvia 80 Venerida 80 Rangia 80
2 NA 88 NA 20 NA 0 NA 0
3 Cnidaria 100 Coral 78 fire 22 octo 12

我以为这会很简单,但是如何在满足第一个条件时更改多个列?

感谢您的帮助。

LP

您可以使用此 awk < 90 时过滤行并将每个 non-numeric 字段更改为 NA:

awk ' < 90 {for (i=2; i<=NF; ++i) if ($i+0 != $i) $i = "NA"} 1' file

OTU Phy P.conf Class C.conf Ord ord.conf Spec S.conf
1 Mollusca 90 Bivalvia 80 Venerida 80 Rangia 80
2 NA 88 NA 20 NA 0 NA 0
3 Cnidaria 100 Coral 78 fire 22 octo 12

how to change multiple columns

假设你事先知道他们的位置很容易 - 只需使用多个 =,让 file.txt 内容为

OTU Phy P.conf Class C.conf Ord ord.conf Spec S.conf    
1 Mollusca 90 Bivalvia 80 Venerida 80 Rangia 80
2 Chordata 88 Fish 20  Salmon 0 pink 0 
3 Cnidaria 100 Coral 78 fire 22 octo 12

然后

awk '<90 {===="NA"}1' file.txt

输出

OTU Phy P.conf Class C.conf Ord ord.conf Spec S.conf    
1 Mollusca 90 Bivalvia 80 Venerida 80 Rangia 80
2 NA 88 NA 20 NA 0 NA 0
3 Cnidaria 100 Coral 78 fire 22 octo 12

请注意,这不限于列,但您也可以对 built-in 变量执行此操作,例如

BEGIN{FS=OFS=","}

确实将字段分隔符 (FS) 和输出字段分隔符 (OFS) 设置为 , 和其他变量,例如

BEGIN{x=y=z=1}

等同于

BEGIN{x=1;y=1;z=1}

(在 gawk 4.2.1 中测试)