Mesclando 2 registros de arquivos por modelo

2

Estou tentando usar o awk para mesclar dois arquivos de texto de uma maneira bastante peculiar, usando duas linhas do arquivo1, um grupo de palavras do arquivo2 (mas colocado em uma linha separada), alternando ad infinitum. Grupos de palavra (s) do arquivo2 são delimitados por vírgulas. Por exemplo:
file1

A Partridge in a Pear Tree
Two Turtle Doves
Three French Hens
Four Calling Birds
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming

file2

I was born, the red planet, I am hungry, on Mars
I love frogs, they are so tasty, with gold sun, red ketchup

Arquivo de saída

A Partridge in a Pear Tree
Two Turtle Doves
I was born
the red planet 
I am hungry
on Mars
Three French Hens
Four Calling Birds
I love frogs
they are so tasty
with gold sun
red ketchup
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming

Detalhes:

  • No arquivo de saída 4 linhas adicionais criadas a partir dos campos Arquivo2 cada 2 linhas file1
  • file1 é dividido em pares de duas linhas, independentemente do conteúdo
  • Uma linha no arquivo2 tem 4 números de grupos (ou seja, 3 números de vírgulas)
  • no arquivo de saída não tem vírgulas
  • Um grupo no arquivo2 tem um número fixo de fild
  • file1 e file2 podem ser arbitrariamente longos
  • arquivo2 sempre menor que arquivo1
  • Os campos Arquivo2 separados por vírgulas sempre ocorrem na mesma ordem em cada registro (3,3,3,2) ie, $ 1 $ 2 $ 3, $ 4 $ 5 $ 6, $ 7 $ 8 $ 9, $ 10 S11

    No arquivo de saída a ser organizado

Uma perdiz em uma árvore de pêra

Duas pombas de tartaruga

$ 1 $ 2 $ 3

$ 4 $ 5 $ 6

$ 7 $ 8 $ 9

$ 10 S11

Três galinhas francesas

Quatro pássaros chamadores

Eu amo sapos

eles são tão saborosos

com sol de ouro

ketchup vermelho

Cinco anéis de ouro

Seis gansos a-Laying

Sete cisnes a-natação

Oito empregadas domésticas a-ordenha

Nove damas dançando

Dez Lordes a-pular

Onze Pipers Piping

Doze Drummers Drumming

  • Comportamento desejado quando você atinge o final de um arquivo, mas ainda tem dados no outro não especificado - os dados restantes (do arquivo1) serão impressos sem alterações

Como faço isso?

    
por darik2 24.07.2016 / 22:48

2 respostas

1

Acredito que você colocou a quinta linha do file1 muito cedo no seu exemplo.

Se eu tiver razão, tente este snippet:

awk '(NR+1)%2{print $0;getline<"file2";n=split($0,a,", ");if(n>1)for(i in a)print a[i];next}1' file1

saída:

A Partridge in a Pear Tree
Two Turtle Doves
I was born
the red planet
I am hungry
on Mars
Three French Hens
Four Calling Birds
I love frogs
they are so tasty
with gold sun
red ketchup
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming
    
por 25.07.2016 / 00:31
0

Além do meu comentário acima, se você preferir o script awk

awk -F', ' '1;!(NR%2)&&(getline <"file2")>0{$1=$1;print}' OFS='\n' file1

onde

  • 1 - synonim de {print $0} :
    • condição = true ( 1 ),
    • ação se não indicar = default ( print ),
    • imprimir sem argumentos = print $0
  • !(NR%2) - para linhas pares:
    • NR - N umber de R ow (record)
    • % - calcula o resedamento após dividir por 2,
    • ! - resultado inverso
  • && - lógico AND
  • getline <"file2" - leia a linha em $0 do arquivo2 e divida-a em campos com o eparador F ield S indicado como opção -F=', ' e devolve 1 se tiver sucesso.
  • $1=$1 - truque para aplicar O utput F ield S eparator: temos que fazer algo com campo (s), caso contrário, o $0 será impresso como é
por 25.07.2016 / 10:29