Awk para mesclar dois arquivos usando o hash

1

Eu tenho dois arquivos do mesmo tamanho, e eu quero trocar um arquivo de 3 colunas com o conteúdo de outro arquivo. Quero imprimir o seguinte:

f1Col1 f1Col2 f1Col3 f1Col4 f1Col5 f1Col6 f2Col1 f2Col2 f2Col3 f1Col10 f1Col11 f1Col12

em que f1Col1 é a primeira coluna de file1 , etc.

Eu tentei usar o seguinte:

awk 'NR==FNR {h1[$1] = $1; h2[$2] = $2; h3[$3] = $3; next} {print $1,$2,$3,$4,$5,$6,h1[$1],h2[$2],h3[$3],$10,$11,$12}' file2 file1

que imprime todas as colunas necessárias de file1 , mas imprime espaços em branco em vez das colunas de file2 . O que há de errado aqui?

(nota: estou usando o OS X Yosemite)

    
por sodiumnitrate 20.04.2015 / 02:34

2 respostas

1

Se file2 contiver (por exemplo)

The    quick    brown
fox    jumps    over
the    lazy     dog.

a primeira parte do seu script awk está sendo definida

h1["The"]="The"
h2["quick"]="quick"
h3["brown"]="brown"
h1["fox"]="fox"
h2["jumps"]="jumps"
h3["over"]="over"
h1["the"]="the"
h2["lazy"]="lazy"
h3["dog."]="dog."

Isso não é bom quando você tenta usar esses valores salvos na segunda parte do script; você precisa indexar os arrays por número de linha:

h1[1]="The"
h2[1]="quick"
h3[1]="brown"
h1[2]="fox"
h2[2]="jumps"
h3[2]="over"
h1[3]="the"
h2[3]="lazy"
h3[3]="dog."

Então, seu script precisa ser

awk 'NR==FNR {h1[FNR] = $1; h2[FNR] = $2; h3[FNR] = $3; next}
{print $1,$2,$3,$4,$5,$6,h1[FNR],h2[FNR],h3[FNR],$10,$11,$12}' file2 file1
    
por 20.04.2015 / 04:28
1

E sobre:

paste <(awk'{ print $1,$2,$3,$4,$5,$6 }' file1) <(awk '{ print $1,$2,$3 }' file2) <(awk '{ print $10,$11,$12 }' file1) 
  • colar recebe entrada dos comandos awk individuais
  • colocando os comandos awk entre '< ()', somente a saída padrão é lida
  • colar mescla os três arquivos de saída linha por linha
por 20.04.2015 / 04:17