awkは、複数の区切り文字を持つファイルから行を印刷します。

awkは、複数の区切り文字を持つファイルから行を印刷します。

次のファイルがあります。

chr1    1197592 .   C   A   .   .   DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0
chr1    1355707 .   G   T   .   .   DP=69;ECNT=1;NLOD=4.51  GT:AD:AF:F1R2   0/1:50,3:0.059:20,3
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4
chr1    2550056 .   TC  CT  .   .   DP=99;ECNT=1;NLOD=9.03  GT:AD:AF:F1R2   0/1:63,2:0.053:33,2

10列の3番目の値が0.06より大きい行を印刷したいと思います。

cat file.txt | cut -f 10 | cut -f 3 | awk -F':' '$3>0.06'

私にだけ与える:

0/1:37,2:0.063:13,0
0/1:30,2:0.089:12,4

全行が欲しいです。 awkを使用して実行できますか?

ベストアンサー1

パイプラインからデータを破棄し始めると(実際にはcut)、同じパイプラインの後続のステップでそのデータを再インポートできません。

代わりに、

$ awk 'split($10,a,":") && a[3] > 0.06' file
chr1    1197592 .   C   A   .   .   DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4

これはスペースで区切られた10番目のフィールドを取得し、コロンで分割して配列にしますasplit()で生成された要素aとの3番目の要素が0.06より大きい場合は、a元の行を印刷します。

ファイル内のフィールドがタブで区切られ、フィールドにスペースが含まれている場合は、-F '\t'withを使用してawk正しいフィールドが正しく見つかることを確認してください(わかっている限り、与えられたサンプルデータにはそのような問題はありません)。


アドレス指定コメントに続く質問:

awk 'split($10,a,":") && a[3] > 0.06 && split($11,b,":") && b[3] > 0.01' file

おすすめ記事