Como juntar dois arquivos, combinando uma coluna com um número irregular de colunas?

1

arquivo1:

0000002|SLM DEV CORP                                               |PO 857
0000003|S TOPPING                                                   |APT 19
0000004|JD  BROS LTD                                                |PO 118
0000005|ZKZ SERVICES                                                |14699  CREDITVIEW RD

arquivo2:

0000001|GTI CONSULTING                     |4513 GLADEBROOK CRES    
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    

resultado esperado:

0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857
0000003|S TOPPING                           |APT 19
0000004|JD PLETT BROS LTD                   |PO BOX 118
0000005|ZKZ SERVICES |ZKZ                   |14699  CREDITVIEW RD

Eu tentei o comando join:

join -j1 1 -j2 1 -t'|' -o 1.1 2.2 2.3 file1 file2

Devido ao delimitador de canais, recebi uma saída incorreta. Além disso, não posso usar nenhum outro símbolo como delimitador, pois qualquer símbolo pode estar disponível na coluna 2.

Eu preciso corresponder a coluna 1 no arquivo 2 e copiar as colunas 2 e 3 no sentido do comprimento.

Eu também tentei fazer o loop dos dados da coluna 1 do arquivo1 no arquivo2 e obter a saída, mas isso leva muito tempo, já que meus arquivos são muito grandes.

    
por Jeeva 27.01.2016 / 11:38

3 respostas

1

Simples com awk , se o campo de associação for único:

awk -F"|" 'a[$1]++' file1 file2
  • -F"|" define o canal como delimitador
  • a[$1]++ é uma condição. Quando a condição é verdadeira, a linha é impressa. A condição se torna verdadeira quando o primeiro campo $1 aparece mais de uma vez.

Se o campo de associação não for único:

awk -F"|" 'a[$1]++&&FNR!=NR' file1 file2
  • FNR!=NR : também é uma condição que deve ser verdadeira. Isso se aplica somente ao segundo arquivo file2 que é processado. Essa condição pode ser removida quando você puder garantir que o primeiro campo em ambos os arquivos seja exclusivo.
por 27.01.2016 / 11:51
1

Um caminho:

awk -F"|" 'NR==FNR{a[$1];next}($1 in a)' file1 file2

Isso lê o primeiro arquivo e armazena todas as chaves em uma matriz. Ao processar o segundo arquivo, imprime apenas as linhas cuja chave está presente no array.

Como o tamanho do arquivo é enorme, não prefira participar, pois ele precisa que os arquivos estejam na ordem de classificação.

    
por 27.01.2016 / 11:46
0

Até onde eu sei, você quer apenas todas as linhas de file2 cujo 1º campo está presente em file1 . Em caso afirmativo, você pode usar grep para pesquisar e awk ou cut para obter o primeiro campo:

$ grep -f <(cut -d '|' -f 1 file1) file2
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    

Ou:

$ grep -f <(awk -F'|' '{print $1}' file1) file2
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    
    
por 27.01.2016 / 12:07