我的问题是这样的:
我想从第4列检查所有的行,直到最后的字段值是否是唯一的0(格式为0.00
),1(格式为1.00
),或者NA
,如果是更换0
其值0.001
。
例如这样的一行:
MA_10 49498 49499 NA NA NA NA 0.00 NA 1.00 NA NA NA NA 1.00 NA NA NA NA 1.00 NA NA NA NA NA NA 1.00 NA NA NA NA
这是预期的输出:
MA_10 49498 49499 NA NA NA NA 0.001 NA 1.00 NA NA NA NA 1.00 NA NA NA NA 1.00 NA NA NA NA NA NA 1.00 NA NA NA NA
但它不应碰到这样的行:
MA_10 49499 49500 NA NA NA NA 0.00 NA 0.50 NA NA NA NA 1.00 NA NA NA NA 1.00 NA NA NA NA NA NA 1.00 NA NA NA NA
因为它的值与NA,0和1不同,为0.50。
我确实是这样,但无法正常工作,因为它也会代替1。
#!/bin/bash -ue
BEGIN { OFS = FS = "\t" }
NR != 1 {
for (i = 4; i <= NF; ++i) {
if ($i = "0" || $i= "1") {
$i = "0.01";
}
}
}
{ print $0 }
提前致谢!
01.awk
:
BEGIN{FS=OFS="\t"}
skip=0
{
for(i=4;i<=NF;i++){
if($i !~ /NA/ && $i!=0 && $i!=1){
skip=1
break
}
}
}
!skip{gsub(/0\.0+/,"0.001")}
1
for循环尝试在第四列开始的一行中寻找一个非NA,非零和非一字段。如果找到,skip
则设置为1,因此该行
!skip{gsub(/0\.0+/,"0.001")}
不会执行,0.00
并且不会变为0.001
。
执行脚本
awk -f 01.awk inputfile
附言:#!/bin/bash -ue
在您的尝试之上,实际上没有任何意义,因为您编写的是awk脚本,而不是bash脚本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句