awkを使用してテーブルをフィルタリングする方法

awkを使用してテーブルをフィルタリングする方法

関心のある各列の特定の値に基づいて複数の列を持つテーブルをフィルタリングする方法を知りたいです。

ここにこの例があります。

    Chr1    16644   0       0       1       1
    Chr1    16645   0       0       1       1
    Chr1    16646   0       0       1       1
    Chr1    16647   0       0       1       1
    Chr1    16648   0       0       1       1
    Chr1    16649   0       0       1       1
    Chr1    16650   0       0       1       1
    Chr1    16651   0       0       1       1
    Chr1    16782   0       0       0       0
    Chr1    16783   0       0       0       0
    Chr1    16784   0       0       0       0
    Chr1    16785   0       0       0       0
    Chr1    16786   0       0       1       1
    Chr1    16787   0       0       1       1
    Chr1    16788   0       0       1       1
    Chr1    16789   0       0       1       1
    Chr1    16790   0       0       1       1

3、4、5、6列から0を含むすべての行を削除したいです。

私はすでに試しました。

cat STARsamples_read_depth.txt | awk '$3 != 0 && $4 != 0&& $5 != 0 && $6 != 0' | less

ただし、4列すべてではなく、一部の列のみがゼロの行も削除します。

それを行う方法はありますか?

ありがとう

アサ

ベストアンサー1

awkを使用すると、関心のあるフィールドをリンクすると、ゼロ以外の数値が生成されるかどうかをテストできます。

$ awk '($3$4$5$6)+0' file
    Chr1    16644   0       0       1       1
    Chr1    16645   0       0       1       1
    Chr1    16646   0       0       1       1
    Chr1    16647   0       0       1       1
    Chr1    16648   0       0       1       1
    Chr1    16649   0       0       1       1
    Chr1    16650   0       0       1       1
    Chr1    16651   0       0       1       1
    Chr1    16786   0       0       1       1
    Chr1    16787   0       0       1       1
    Chr1    16788   0       0       1       1
    Chr1    16789   0       0       1       1
    Chr1    16790   0       0       1       1

または、何らかの理由で各フィールドを個別にテストする場合は、次の手順を実行します。

$ awk '{for (i=3; i<=6; i++) if ($i != 0) { print; next } }' file
    Chr1    16644   0       0       1       1
    Chr1    16645   0       0       1       1
    Chr1    16646   0       0       1       1
    Chr1    16647   0       0       1       1
    Chr1    16648   0       0       1       1
    Chr1    16649   0       0       1       1
    Chr1    16650   0       0       1       1
    Chr1    16651   0       0       1       1
    Chr1    16786   0       0       1       1
    Chr1    16787   0       0       1       1
    Chr1    16788   0       0       1       1
    Chr1    16789   0       0       1       1
    Chr1    16790   0       0       1       1

質問に示すように、入力が整数でない可能性がある場合(コメントを参照)、上記の2番目のスクリプトを使用するか、接続の数値比較の代わりに文字列にすることができます。

awk '($3$4$5$6) != "0000"' file

おすすめ記事