질문: 파일이 주어지면 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
, ) { ...}
은 선택 사항이라는 점을 기억하세요.