対立遺伝子の頻度を記述するファイルがあり、最後の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つの問題があります。
最初は区切り記号です。スペースとスラッシュに分割するには、対応する正規表現を指定し、次のように使用する必要がありますFS
。FS="[ /]+"
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