如果列小于值替换其他列值 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 中测试)
如果某个查询列低于某个值,我想替换多个列值。
示例文件测试:
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 中测试)