![将文件分割成多个部分](https://linux22.com/image/81329/%E5%B0%86%E6%96%87%E4%BB%B6%E5%88%86%E5%89%B2%E6%88%90%E5%A4%9A%E4%B8%AA%E9%83%A8%E5%88%86.png)
问题:给定一个文件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
, ) { ...}
都是可选的。