2016-08-30 13 views
-2

私は以下のコンテンツを持つファイルを持っているとしましょう。私は全体の3番目の列を検索するシェルスクリプトやawkプログラムを書いて、列全体が良好であれば、その後「Everthingがよさそうだ」と、それは誰が悪い見つけた包みならば、物事」として印刷として印刷する必要があるファイルのすべての行の特定の列が条件を満たすかどうかを確認

ok  yes bad 
ok  yes good 
ok  yes bad 
ok  yes good 
ok  yes bad 
ok  yes good 

+4

を試してみましたか? – John1024

答えて

2

大丈夫ではありません、単純なawkはワンライナーの状態でそれを実行します。

awk 'BEGIN {ok=1;} $3=="bad" { ok=0 } END { if (ok==0) {print "Things are not okay"} else { print "Everything looks good"} }' yourfile 

BEGINブロックはファイルの解析を開始する前にok 1に初期化されます。デフォルト:不良が見つからない限り、すべてokです。

あなたのファイルは、天然スペース/タブの分離、awkのフィールドセパレータを微調整する必要はありませんがあります。$3は、直接私たちに必要な3番目のフィールドです。どこかでbadを満たしているかどうかをテストし、そうであればokフラグを取り消してください。

ENDブロックは、ファイルの最後に実行されます。 okをチェックし、関連するメッセージを印刷してください。

+0

ファイル全体をスキャンすることを意図しています。 ENDブロックにフラグを設定して印刷したいとします。 –

+0

@jean:それは複数回印刷されています。私はawkに列全体を検索させ、列全体が "良い"値を持っていれば1回だけ印刷する必要があります。この場合は複数回印刷します。 – suru1432002

+0

@ suru1432002、編集内容に注意してください。 –

0
$ awk '$3=="bad"{f=1; exit} END{print (f ? "Things are not OK" : "Everything looks good")}' file 
Things are not OK 

上記フラグを立てるとexistのメインワークループ(注:exitは、そう、それはENDセクションに移動します、プログラム、入力を読んでいるだけで、暗黙のループを終了しません)最初は「悪い」という結果が得られるので、できるだけ効率的です。そして、ENDセクションでは、そのフラグが設定されているかどうかに基づいて関連メッセージを出力するために三項式を使います。

あなたの人生でこれまでどんなテキスト操作をしていたとしても、Arnold RobbinsのEffective Awk Programming、第4版を読んで、簡潔で効率的で堅牢で移植性の高い方法を学んでください。

0

あなたは行うことができます:あなたは、これまで何をして

awk '$3=="bad"{bad++} END { if (bad>0) print bad " bads found"; else print "all goods!"}' file 
関連する問題