将文件分割成多个部分

将文件分割成多个部分

问题:给定一个文件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, ) { ...}都是可选的。

相关内容