私の質問はこれです:
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とその値が異なるためです。
私はsmtでこれをしましたが、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 }
よろしくお願いします!
ベストアンサー1
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 ループは、4 番目の列で始まる行で、NA 以外、0 以外、1 以外のフィールドを検索しようとします。見つかった場合はskip
1に設定されます。
!skip{gsub(/0\.0+/,"0.001")}
実行されてい0.00
ません0.001
。
スクリプトの実行
awk -f 01.awk inputfile
PS:#!/bin/bash -ue
bashスクリプトではなくawkスクリプトを書いたので、あなたの試みは本当に意味がありません。