divide o arquivo em várias partes

1

Problema: dado um arquivo samplein , ele pode ser dividido em várias partes da seguinte forma:

$ 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

A receita acima era 5 de esta página
. No entanto, tive o caso em que o padrão ( START , neste caso) não ocorreu na primeira linha.

Mas se adicionarmos uma nova linha a samplein , o mesmo código / receita não funcionará mais!

$ 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

Por favor, explique também na resposta como este comando awk funciona em primeiro lugar. O único contexto que eu tinha usado o awk anteriormente era {BEGIN}{loop over all lines}{END} . Esta receita parece um pouco diferente disso!

    
por Debanjan Basu 14.01.2016 / 16:33

1 resposta

4

Basta adicionar x="F0" ao início para que o arquivo de destino seja sempre definido, mesmo que a primeira linha não contenha o padrão:

awk 'BEGIN { x="F0" ; } /START/{x="F"++i;}{print > x}' 

O texto acima detalha esse pseudo código:

### -> 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

Lembre-se de que todas as cláusulas como BEGIN , END , { ...} são opcionais.

    
por 14.01.2016 / 16:49