Mesclar arquivos usando um valor de coluna comum

3

Eu quero juntar esses dois arquivos: Arquivo 1 (1 milhão de linhas) e Arquivo 2 (10.000 linhas) no novo Arquivo 3 (deve ser 1 milhão de linhas) usando um comando awk

Arquivo 1:

 471808241 29164840 1 10001 156197396 
 471722917 21067410 1 31001 135961856 
 471941441 20774160 1 7001  180995072 
 471568655 29042630 1 15001 157502996 
 471524711 20716360 1 4001  180226817 
 471873918 29583520 1 2001  128567298 
 471568650 29042631 1 15002 157502910 

Arquivo 2

610146 156197396 
531101 135961856 
704011 180226817 
502216 128567298 
707012 180995072 
615246 157502996 
685221 157502910 

Saída desejada:

471808241 29164840 1 10001 156197396 610146 
471722917 21067410 1 31001 135961856 531101 
471941441 20774160 1 7001  180995072 707012 
471568655 29042630 1 15001 157502996 615246 
471524711 20716360 1 4001  180226817 704011 
471873918 29583520 1 2001  128567298 502216 
471568650 29042631 1 15002 157502910 685221
    
por Nydenn 26.02.2017 / 11:13

2 respostas

4

Se você não se importar em classificar os arquivos, poderá usar join (embora possa não ser prático para o seu caso, é divertido ver como isso pode ser feito)

Primeiro, classifique File 2 no campo numérico comum

sort -k2 "File 2" > file2clean

Então você pode join os dois arquivos

sort -k5 "File 1" | join -a 1 -o 1.1 1.2 1.3 1.4 0 2.1 -1 5 -2 2 - file2clean | tee "File 3"

Notas

  • -a 1 imprime as linhas em File 1 que não podem ser emparelhadas (como esse arquivo tem mais linhas, suponho que você queira)
  • -o 1.1 1.2 1.3 1.4 0 2.1 ordem de campo para a linha de saída - o campo ao qual nos associamos é 0 e 1.1 é o primeiro campo do primeiro arquivo e assim por diante
  • -1 5 -2 2 une-se no quinto campo do primeiro arquivo e no segundo campo do segundo arquivo
  • - file2clean here - representa a entrada padrão passada ao longo do pipeline, ou seja, a versão classificada de File 1

Quando terminar, você pode excluir o intermediário file2clean .

    
por Zanna 26.02.2017 / 12:13
2

Eu não sei quão eficiente será para arquivos do tamanho que você mencionou, mas desde que você pediu por uma solução awk é realmente apenas uma questão de criar uma tabela de consulta a partir do segundo arquivo e depois usar a última campo do primeiro arquivo para digitar, por exemplo,

awk 'NR==FNR {a[]=; next} {$(NF+1) = a[$NF]} 1' file2 file1 > file3

Note que você não especifica o que deve ser feito caso não haja correspondência - nesse caso, ele adicionará um campo vazio. Se esse não for o comportamento desejado, você pode testar se $NF existe em a primeiro.

    
por steeldriver 26.02.2017 / 15:21