ファイルを複数の部分に分割

ファイルを複数の部分に分割

質問:ファイルが与えられたら、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

すべての句(例えば、、、BEGINEND{ ...}オプションであることを覚えておいてください。

関連情報