2012-10-23 17 views
5

私は、与えられたパターンがマッチしたときに次の行を現在の行に折り畳むシンプルなawkライナーを持っています。ここでは、次のとおりです。次の入力と末尾の数字はawkスクリプトの本文にどのような影響を与えますか?

awk '/two/ { printf $1; next; } 1' test.txt 

one 
two 
three 
four 
five 
six 

one 
two 
three 
four 

あなたが得る: "3" が何である "2" で折り畳まれていること

one 
twothree 
four 
five 
six 

one 
twothree 
four 

注意を私は発生したかった。私はこの解決策(どこを覚えていないか)を見つけ、後ろの '1'が欠けているように見えて、望みの効果が得られたと思った。あなたがそれを取り出すと、あなたは得る:

awk '/two/ { printf $1; next; }' test.txt 
twotwo 

結果として。だから私の質問は、後ろの '1'は何をするのですか、それはどこに文書化されていますか?

ありがとうございます!

答えて

6

awkの場合、1は真、真の場合はawkがデフォルトで現在の行を出力します。

例:

  • awk '1' /etc/passwdは、ファイル全体を印刷します
  • awk '0' /etc/passwd意志ない印刷あなたは算数でもいいです(またはあなたが想像力やプログラミングを持っている場合は、ファイル全体

スキル)には、このような動作でできることがたくさんあります。

3

"Awk one-liner全体の最後にある '1'は修正された行を出力します(それは" print $ "の構文砂糖です))"。

からcatonmat

+0

ああ、あなたの入力はprintfのフォーマット文字列が含まれているために発生した場合に何が起こるか見て!リンクありがとう。非常に役立ちます。 – drsnyder

1

あなたはあなたの特定の質問にあなたの答えを得たが、あなたの投稿のスクリプトは安全ではありません。 printfの第1引数はフォーマット文字列であり、データではありません。データを印刷するために使用することもできますが、スクリプトからハードコードされている場合にのみ使用できます。入力から読み取るときではありません。

$ cat file 
one 
two%s 
three 
four 

$ awk '/two/ { printf $1; next; } 1' file 
one 
awk: cmd. line:1: (FILENAME=file2 FNR=2) fatal: not enough arguments to satisfy format string 
     `two%s' 
      ^ran out for this one 

スクリプトを書くための正しい方法は次のとおりです:

$ awk '/two/ { printf "%s",$1; next; } 1' file 
one 
two%sthree 
four 
関連する問題