Mesclar arquivos usando uma coluna comum

6

Eu tenho dois arquivos dos quais eu quero criar um terceiro que contenha todas as informações.

arquivo 1:

a 111 
b 222 
c 333 
d 666 
e 777 

arquivo 2:

111 x1  
222 x2
333 x3
444 x4 
555 x5 
666 x6 
777 x7 
888 x8

Eu gostaria de combiná-los da seguinte forma:

111  x1  a
222  x2  b
333  x3  c
444  x4  0
555  x5  0
666  x6  d
777  x7  e
888  x8  0

Nota:

A segunda coluna do arquivo 1 é um subconjunto da primeira coluna do arquivo 2

    
por gforce89 09.12.2015 / 17:52

4 respostas

7

O comando join faz quase o que você precisa, se os arquivos forem classificados como em suas amostras:

join -12 -a2 file1 file2 -o2.1,2.2,1.1

Você só precisa adicionar os zeros às linhas sem correspondência. Você pode usar a opção -e para isso:

join -12 -a2 file1 file2  -o2.1,2.2,1.1 -e0
    
por choroba 09.12.2015 / 18:17
10

Usando a associação:

join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1

O comando de junção une as linhas de dois arquivos que compartilham um campo comum de dados. Nesse caso: Junte o arquivo2 e o arquivo1 usando o campo 1 ( -1 1 ) do arquivo2 e o campo 2 ( -2 2 ) do arquivo1.

A saída será: "campo associado, campo 2 do arquivo2, campo 1 do arquivo1" ( -o'0,1.2,2.1' ), se houver um campo ausente, coloque 0 ( -e0 )

Se um dos dois arquivos tiver mais registros, adicione-os (nesse caso, arquivo2) ( -a1 )

Por favor, consulte a manpage do comando join

    
por LilloX 09.12.2015 / 18:16
4

Um pouco awk magic:

awk 'FNR==NR{a[]=;next}{if(a[]==""){a[]=0}; \
    printf "%s%s%s%s%s\n",,FS,,FS,a[]}' \
    file1 file2

ou

awk 'FNR==NR{a[]=;next}{if(a[]==""){a[]=0};
    print ,,a[]}' file1 file2

Saída

111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

Explicação

  • FNR==NR{a[]=;next}

    Executa sobre file1 ( FNR==NR ) e cria uma estrutura de valor-chave. A chave é a segunda coluna ( ) de file1 , o valor é a primeira coluna ( ) de file1

  • {if(a[]==""){a[]=0};print ,,a[]}

    Executa sobre file2 e

    • if(a[]==""){a[]=0}

      Se a chave na primeira coluna ( ) em file2 não existir em file1 , precisamos de um 0

    • print ,,a[]

      Imprima (usando print ) a primeira e a segunda colunas de file2 e o valor da estrutura de valor-chave com a chave da primeira coluna ( ) de file2

      ou

    • printf "%s%s%s%s%s\n",,FS,,FS,a[]}'

      Imprima (usando printf ) a primeira e a segunda colunas de file2 e o valor da estrutura de valor-chave com a chave da primeira coluna ( ) de file2 .

      • FS é o separador entre as colunas, retirado do arquivo de entrada

      • "%s%s%s%s%s\n"

        é a formatação para a saída

        • %s - String

        • \n - Newline

por A.B. 09.12.2015 / 18:14
1

Usando q :

$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

Pode ser mais legível assim às vezes.

    
por Vi. 10.12.2015 / 01:51