Une dois arquivos com números de campos diferentes

3

Eu tenho dois arquivos: s2.txt

14 3KC12828ACBA 
43 8DG59242BAAD 
25 8DG60566AAAF 
6 8DG60912AAAF

e pbas.txt:

3AG33662AAAC
3KC12828ACBA
8DG59242BAAD
8DG60349AAAC
8DG60565AAAG
8DG60566AAAF
8DG60568AAAC
8DG60912AAAF
8DG62635AAAC

Usando bash no UNIX Eu quero juntar arquivos para obter um arquivo assim:

3AG33662AAAC
3KC12828ACBA 14
8DG59242BAAD 43
8DG60349AAAC
8DG60565AAAG
8DG60566AAAF 25
8DG60568AAAC
8DG60912AAAF 6
8DG62635AAAC

Como pode fazer isso?

    
por costica_p 12.02.2017 / 19:47

2 respostas

10

Isso é o que o join faz:

join -2 2 -a 1 pbas.txt s2.txt

As opções dizem:

  • -2 2 : o segundo arquivo usa a segunda coluna para armazenar a chave
  • -a 1 : imprime todas as linhas do arquivo 1, mesmo que não haja correspondência no arquivo 2.
por 12.02.2017 / 19:54
2

AWK

É bastante fácil conseguir isso no awk:

$ awk 'NR==FNR{a[$2]=$1; next}{print $1,a[$1]}' file1.txt file2.txt    
3AG33662AAAC
3KC12828ACBA 14
8DG59242BAAD 43
8DG60349AAAC
8DG60565AAAG
8DG60566AAAF 25
8DG60568AAAC
8DG60912AAAF 6
8DG62635AAAC

Não há nada de especial acontecendo - essa técnica é freqüentemente usada por aqueles que usam awk frequentemente, especialmente ao processar vários arquivos, e é baseada na ideia de carregar informações do primeiro arquivo no array.

A maneira como isso funciona é simples. Primeiro usando NR==FNR (comparação entre o número da linha processada atual e o número da linha no arquivo atual) lemos tudo de file1.txt (no exemplo do OP que é s2.txt ) para a matriz associativa de valores. A palavra-chave next nos permite ignorar o próximo codeblock enquanto ainda estamos no primeiro arquivo. Quando estivermos fora do primeiro arquivo, o próximo codeblock será executado, sempre imprimindo o campo 1 e o item correspondente no array, se existir.

Perl

Usando uma ideia parecida com a do awk, podemos conseguir um resultado similar em Perl assim:

perl -lane 'if($F[1]){$hash{$F[1]}=$F[0]}else{print "$_ $hash{$_}"}' file1.txt file2.txt
    
por 13.02.2017 / 02:51