Mesclar dois arquivos: duas linhas, linha parcial, duas linhas, linha parcial, etc [fechado]

1

Olá, estou tentando usar awk para mesclar dois arquivos de texto de uma maneira bastante peculiar, pegando duas linhas de file1 , um grupo de palavra (s) de file2 (mas colocado em uma linha separada), alternando ad infinitum . Grupos de palavra (s) de file2 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
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber door—
            Only this and nothing more.”

file2

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

Arquivo de saída

A Partridge in a Pear Tree
Two Turtle Doves
I was born
Three French Hens
Four Calling Birds
on Mars
Five Gold Rings
Six Geese a-Laying
the red planet
Seven Swans a-Swimming
Eight Maids a-Milking
I love frogs
Nine Ladies Dancing
Ten Lords a-Leaping
they are so tasty
Eleven Pipers Piping
Twelve Drummers Drumming
with
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore—
ketchup
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
I am hungry
“’Tis some visitor,” I muttered, “tapping at my chamber door—
            Only this and nothing more.”

Detalhes:

  • file1 é dividido em pares de duas linhas, independentemente do conteúdo
  • Uma linha em file2 pode ter qualquer número de grupos (ou seja, qualquer número de vírgulas)
  • Um grupo em file2 pode ter qualquer número de palavras (incluindo zero ???)
  • file1 e file2 podem ser arbitrariamente longos
  • Comportamento desejado ao chegar ao final de um arquivo mas ainda tem dados no outro não é especificado.

Como faço isso?

    
por darik2 20.07.2016 / 10:27

4 respostas

1

Supondo que você queira inserir a frase que está entre a vírgula do file2 após cada linha de 2 file1 , você pode tentar o seguinte script awk :

 awk -F", *" 'NR==FNR{
                 for(i=1;i<NF+1;i++)
                    a[i]=$i
              } 
              NR>FNR{
                 print; 
                 if(FNR%2==0) 
                     print a[FNR/2]
              }' file2 file1
    
por 20.07.2016 / 10:42
2
awk -F ', *' '!skip {for (i = 1; i <= NF; i++) a[++n] = $i; next}
              {print}
              FNR % 2 == 0 && m++ < n {print a[m]}
             ' file2 skip=1 file1
    
por 20.07.2016 / 10:42
1

Jogue com o coeficiente R ecord S do awk (aqui assumindo o GNU awk ou versões recentes do mawk )

awk '{print}!(NR%2){getline <"file2";print}' RS="\n|, " file1

Se houver , na (s) linha (s) do arquivo1 , uma versão mais correta poderia ser:

awk 'BEGIN{r=RS}{print}!(NR%2){RS=r"|, ";getline <"file2";print;RS=r}' file1

A questão modificada pode ser resolvida (de forma portável) por

awk '{print};!(NR%2) && (getline <"file2")>0{gsub(", *", "\n");print}' file1
    
por 20.07.2016 / 11:55
1

Supondo que a interpretação de @oliv esteja correta, essa solução também pode funcionar, embora não use awk :

paste -d '\n ' file1 <(sed  's/^/\n/;s/, */\n\n/g' file2) | sed '/^$/d'

Dados os requisitos atualizados do OP, isso não parece mais uma abordagem viável.

    
por 20.07.2016 / 11:15