awkを使用してパイプで区切られたファイルの特定の列でゼロ以外の値を持つ行を取得するにはどうすればよいですか?

awkを使用してパイプで区切られたファイルの特定の列でゼロ以外の値を持つ行を取得するにはどうすればよいですか?

以下のようにパイプで区切られたファイルがあります。

TEST|RALPH|JACKSON|2|3|1
TEST|STEVE|PARKER|0|1|1
TEST|MARK|WOODS|0|1|1
TEST|DAVE|KNIGHT|1|3|1
TEST|JOHN|DOE|0|1|1

列4、5、6でゼロ以外の値を持つ行をフィルタリングして別のファイルに書きたいと思います。

期待される出力

TEST|RALPH|JACKSON|2|3|1
TEST|DAVE|KNIGHT|1|3|1

私は次のawkを使ってこれを達成しようとしています。

awk -F "|" '$4 != 0 && $5 !=0 && $6 !=0' input.txt > output.txt

awkを使ってこれを行うより良い方法があるかどうか疑問に思います。

ベストアンサー1

現在のアプローチは正確で明確で宣伝されたとおりに機能するため、実際に変更する必要はありません。

しかし、より多くの熱をテストするには、次のように話します。みんなawk列3の後に列があると、プログラムが少し長くなる可能性があります(列が多い場合)。

別の方法はループを使用することです。

$ awk -F '|' '{ for (i=4; i<=NF; ++i) if ($i == 0) next; print }' file
TEST|RALPH|JACKSON|2|3|1
TEST|DAVE|KNIGHT|1|3|1

プログラムawkは列3以降のすべての列の値をテストし、値が0の列が見つかるとすぐに現在の行をスキップします。 0が見つからない場合、現在の行が印刷されます。

おすすめ記事