Shell-Script
將文件拆分為多個部分
問題:給定一個文件
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
, 的子句{ ...}
都是可選的。