Combina arquivos de texto com o mesmo cabeçalho

2

Com csplit , consegui dividir um arquivo de texto com vários nomes e datas usando essas datas como um delimitador.

Exemplos de arquivos:

Arquivo 'xx00':

1950
Frank
Church
James
McClure

Arquivo 'xx01':

1945
Zenon

Arquivo 'xx02':

1950
Bob

O que eu quero fazer é mesclar todos os arquivos com o mesmo cabeçalho (o ano) com aquele ano como o nome do arquivo e sem o cabeçalho. Então a saída seria:

Arquivo '1950':

Frank 
Church
James
McClure
Bob

Arquivo '1945'

Zenon
    
por Mikel SS 07.04.2018 / 17:33

1 resposta

3

Você pode usar awk aqui:

awk 'FNR==1{ header=$0;next} {print >"file"header}' filexx*

Produzirá um ou mais novos arquivos de concatenação com os mesmos cabeçalhos na primeira linha:

$ cat file1945
Zenon
$ cat file1950
Frank
Church
James
McClure
Bob

Explicações incluindo citações de awk documentação :

A variável predefinida predefinida FNR é o número atual do registro no arquivo atual. awk incrementos FNR cada vez que ler um novo registro (consulte Registros ) . awk redefine FNR para zero toda vez que inicia um novo arquivo de entrada. Então, quando fazemos FNR==1 significa que só tomamos medidas e obtemos essa linha quando é a primeira linha do arquivo atual e salvamos seu conteúdo em uma variável chamada header .

As instruções next awk para parar imediatamente o processamento do registro atual e passar para o próximo registro. Isso significa que nenhuma regra adicional é executada para o registro atual e o restante da ação da regra atual não é executada, portanto, da próxima vez FNR!=1 e isso fará com que awk execute o próximo bloco que é redirecionando o print output (registros / linhas) para o arquivo chamado file#### ( #### irá substituir com o valor da variável header , lembre-se que você precisa ter citado a parte do nome do arquivo que é uma string .

Usamos o redirecionamento single - ' > ' aqui. Quando esse tipo de redirecionamento é usado, o arquivo de saída é apagado antes que a primeira saída seja gravada nele. As gravações subseqüentes no mesmo arquivo de saída não apagam arquivo de saída , mas são anexadas a ele. (Isso é diferente de como você usa redirecionamentos em scripts de shell.) Se arquivo de saída não existir, ele será criado.

    
por devWeek 07.04.2018 / 18:48