5

与えられたパターンが一致したときに次の行を現在の行に折りたたむ単純なawkoneライナーがあります。ここにあります:

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

次の入力で:

one
two
three
four
five
six

one
two
three 
four

あなたが得る:

one
twothree
four
five
six

one
twothree 
four

「3つ」は「2つ」と折りたたまれていることに注意してください。これは私がやりたかったことです。私はこの解決策を見つけ(どこを覚えていないか)、末尾の「1」が目的の効果をもたらす欠落部分であるように見えるのは奇妙だと思いました。あなたがそれを取り出すならば、あなたは得る:

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

その結果。だから私の質問は、末尾の「1」は何をするのか、そしてそれはどこに文書化されているのかということです。

ありがとう!

4

3 に答える 3

6

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

例:

  • awk '1' /etc/passwdファイル全体を印刷します
  • awk '0' /etc/passwdファイル全体を印刷しませ

算数が得意な場合(または想像力やプログラミングのスキルがある場合)、この動作で実行できるトリックはたくさんあります。

于 2012-10-23T20:28:34.877 に答える
3

「Awkワンライナー全体の最後にある「1」は、変更された行を印刷します(これは、「print」の構文糖衣です(それ自体は「print $ 0」の構文糖衣です))」。

--catonmat _

于 2012-10-23T20:28:38.937 に答える
1

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

$ 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
于 2012-10-23T20:51:42.820 に答える