関心のある各列の特定の値に基づいて複数の列を持つテーブルをフィルタリングする方法を知りたいです。
ここにこの例があります。
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