问题:给定一个文件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}
。这个食谱看起来有点不同!
只需添加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
){ ...}
都是可选的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句