質問:ファイルが与えられたら、samplein
次のようにいくつかの部分に分割できます。
$ cat samplein
START
Unix
Linux
START
Solaris
Aix
SCO
$ awk '/START/{x="F"++i;}{print > x}' samplein
$ ls F*
F1 F2
$ cat F1
START
Unix
Linux
$ cat F2
START
Solaris
Aix
SCO
上記はレシピ5ですこのページ。しかし、最初の行にパターン(この場合)が表示されない状況が
発生しました。START
しかし、同じコード/レシピに改行文字を追加すると、samplein
もう機能しません!
$ echo -e "firstline\n$(cat samplein)" > samplein
$ cat samplein
$ awk '/START/{x="F"++i;}{print > x}' samplein
awk: cmd. line:1: (FILENAME=samplein FNR=1) fatal: expression for `>' redirection has null string value
また、このawkコマンドがどのように機能するかを答えてください。以前にawkを使用した唯一のコンテキストはです{BEGIN}{loop over all lines}{END}
。このレシピはそのレシピと少し異なります!
答え1
x="F0"
最初の行にパターンが含まれていなくても、ターゲットファイルが常に定義されるように先頭に追加するだけです。
awk 'BEGIN { x="F0" ; } /START/{x="F"++i;}{print > x}'
上記は次の擬似コードに分類されます。
### -> BEGIN { x="F0" ; }
i=0 # implicit
x="F0" # explicit
loop through file
### -> /START/{x="F"++i;}
if ( line contains "START" ) output file is F(next i value) ;
### -> {print > x}
print line to output file
endloop
すべての句(例えば、、、BEGIN
)END
は { ...}
オプションであることを覚えておいてください。