awk /pattern/ { print "text"} /pattern/ {print ""} を使用するときに ELSE モードはありますか?

awk /pattern/ { print

次のテキストファイルがあるとしましょう。

R1 12 324 3453 36 457 4 7 8
R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242

awkこの行を別の方法で処理したいと思います。

awk '/R1/ { print "=>" $0} /R2/ { print "*" $0} '

また、残っているすべての行をそのまま印刷したいです(すでに処理した行を繰り返さずに)。デフォルトでは、 /ELSE/ { print $0}行の末尾に1つを追加する必要がありますawk

そんなことありますか?

ベストアンサー1

簡素化されたアプローチawk

awk '/R1/ {print "=>" $0;next} /R2/{print "*" $0;next} 1' text.file

[jaypal:~/Temp] cat text.file 
R1 12 324 3453 36 457 4 7 8
R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242

[jaypal:~/Temp] awk '/R1/ { print "=>" $0;next} /R2/{print "*" $0;next}1' text.file
=>R1 12 324 3453 36 457 4 7 8
*R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242
[jaypal:~/Temp] 

パターン{Action}お問い合わせの画期的な進歩:

  • /R1/ { print "=>" $0;next}/R1/印刷ジョブを含む行が実行されることを示します。これは、awkステートメントの残りの部分が無視され、次の行がレビューされることを意味します。=>next

  • /R2/{print "*" $0;next}: これは、pattern /R2/印刷ジョブに一致する行が実行されることを意味します。処理が始まる*と、awk最初のpattern {action}文は無視されます。これで2番目のドアが完了します。これは、もはや処理を必要とせず、適切に次の行に移動することを意味します。pattern /R1//R2/pattern {action}nextawk

  • 1すべての行を印刷します。条件が指定されていない場合、{action}awkはデフォルトでusingを使用します{print}。ここの条件は1trueと解釈されるので、常に成功します。この点に達すると、最初と2番目のステートメントは無視または無視されるためです(およびをpattern {action}含まない行の場合)。したがって、基本印刷ジョブは残りの行で行われる。/R1//R2/

おすすめ記事