awkスクリプトで除算を使用する

awkスクリプトで除算を使用する

対立遺伝子の頻度を記述するファイルがあり、最後の2列の頻度の1つが0.01以上の場合は、awkを使用して行を印刷しようとします。周波数ファイルの形式は次のとおりです。私は最後の2つの周波数に興味があります。

2L      10000133        A      125/125 115/131 0/125   16/131
2L      10000374        A      121/124 143/143 3/124   0/143

awkに関する限られた知識に基づいて、次のコードを書いています。

cat myfile.txt |
awk ' BEGIN { {FS="/"}{OFS="\t"}
     if( ($8>0) && ($8/$9 >= "0.01") || ($10>0) && ($10/$11 >= "0.01"))
             { print $1,$2 }
            }' > myfilteredfile.txt

ただし、出力ファイルmyfilteredfile.txtは空です。出力ファイルが印刷される予定です。

2L      10000133
2L      10000374

これは、2行の最後の2列の頻度が0.01以上であるためです。どんな提案がありますか?

ベストアンサー1

既存のスクリプトには2つの問題があります。

最初は区切り記号です。スペースとスラッシュに分割するには、対応する正規表現を指定し、次のように使用する必要がありますFSFS="[ /]+"

2番目は、すべてのコードがBEGINブロック内にあることです。BEGIN初期化ブロック(または他の場所)に区切り文字が必要です。例えば特定のAWKパラメータを使用)次に、マッチャブロックを使用してその行を処理します。

このバージョンの仕組み:

awk 'BEGIN { FS="[ /]+"; OFS="\t" }
     (($8>0) && ($8/$9 >= "0.01") || ($10>0) && ($10/$11 >= "0.01")) {
         print $1, $2
     }' myfile.txt

厳密に言えば、数値を一致させようとするので、0.01代わりに使用する方が良いです。"0.01"

awk 'BEGIN { FS="[ /]+"; OFS="\t" }
     (($8>0) && ($8/$9 >= 0.01) || ($10>0) && ($10/$11 >= 0.01)) {
         print $1, $2
     }' myfile.txt

おすすめ記事