Shell-Script

將文件拆分為多個部分

  • August 7, 2016

問題:給定一個文件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, 的子句{ ...}都是可選的。

引用自:https://unix.stackexchange.com/questions/255329