すべての行が 0、NA、1 の場合は、すべて 0 に置き換えます。

すべての行が 0、NA、1 の場合は、すべて 0 に置き換えます。

私の質問はこれです:

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 以外のフィールドを検索しようとします。見つかった場合はskip1に設定されます。

!skip{gsub(/0\.0+/,"0.001")}

実行されてい0.00ません0.001

スクリプトの実行

awk -f 01.awk inputfile

PS:#!/bin/bash -uebashスクリプトではなくawkスクリプトを書いたので、あなたの試みは本当に意味がありません。

おすすめ記事