Adicionando coluna com base na correspondência da segunda coluna

4

Eu tenho dois arquivos. O primeiro arquivo tem o seguinte formato:

10D0325 2465 0 0 -9 -9
10D0598 2567 0 0 -9 -9
10D0562 2673 0 0 -9 -9
10D0175 2457 0 0 -9 -9
10D0241 2209 0 0 -9 -9
10D0954 2312 0 0 -9 -9
10D0446 2489 0 0 -9 -9

O segundo arquivo tem este formato:

10D0325 1
10D0598 1
10D0175 2
10D0954 1
10D0446 2

O que eu quero fazer é adicionar a segunda coluna do segundo arquivo ao primeiro arquivo, com base na variável ID. Como você pode ver, a primeira coluna pode ser usada como uma variável identificadora para corresponder ao primeiro conjunto de dados com o segundo. No entanto, o primeiro arquivo contém algumas linhas / IDs que não estão presentes no segundo arquivo. Portanto, não posso simplesmente pedir os dois arquivos e colar essa coluna no primeiro arquivo.

Deve haver uma maneira bastante fácil de fazer isso, infelizmente minhas habilidades em Linux são limitadas.

P.S. Por uma questão de clareza, isto é o que eu gostaria que o arquivo resultante parecesse (qualquer outro símbolo pode ser usado para indicar falhas em vez de espaços em branco):

10D0325 2465 0 0 -9 -9 1
10D0598 2567 0 0 -9 -9 1
10D0562 2673 0 0 -9 -9
10D0175 2457 0 0 -9 -9 2
10D0241 2209 0 0 -9 -9
10D0954 2312 0 0 -9 -9 1
10D0446 2489 0 0 -9 -9 2
    
por mats 12.08.2015 / 12:40

2 respostas

2

Isso é muito fácil com awk :

awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$1]}' file2 file1

Primeiro (quando o arquivo2 está sendo lido) criamos uma matriz a que armazena a segunda coluna do arquivo2, indexada com a primeira coluna. E então nós imprimimos file1 adicionando valor de um array.

    
por 12.08.2015 / 12:47
3

Use join :

join -j 1 -a 1 <(sort file1) <(sort file2)
  • -j 1 : o campo de junção é o primeiro
  • -a 1 : imprima linhas não pareadas do arquivo 1
  • sort : os arquivos devem ser classificados para entrar
por 12.08.2015 / 12:53