Mesclar 2 arquivos com base na correspondência de campo

4

Eu quero criar um arquivo que contenha colunas de dois arquivos de entrada. File1 é como:

aa 32
bb 15
cc 78

O arquivo 2 é:

fa 19
bc 23
cc 50
de 28
aa 45
bb 31

A tarefa é, ler Arquivo1, se o primeiro campo de uma linha existir entre o primeiro campo do Arquivo2, depois imprimir essa linha do Arquivo2, com as duas colunas e adicionar a entrada da segunda coluna do Arquivo1 contendo o primeiro campo. / p>

A saída deve ser como:

aa 45 32
bb 31 15
cc 50 78

o awk é o preferido para o script.

    
por hldn 08.10.2014 / 06:16

2 respostas

8

$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78

Explicação:

awk implicitamente percorre cada arquivo, uma linha por vez. Como nós demos a file2 como o primeiro argumento, ele é lido primeiro. file1 é lido em segundo lugar.

  • FNR==NR{a[$1]=$2;next}

    NR é o número de linhas que awk leu até agora e FNR é o número de linhas que awk leu até o momento no arquivo atual. Assim, se FNR==NR , ainda estamos lendo o primeiro arquivo nomeado: file2 . Para cada linha em file2 , atribuímos a[$1]=$2 .

    Aqui, a é uma matriz associativa e a[$1]=$2 significa salvar a segunda coluna do arquivo2, denotada $2 , como um valor na matriz a usando a primeira coluna do arquivo2, $1 como a chave.

    next diz a awk para pular o restante dos comandos e recomeçar com a próxima linha.

  • ($1 in a) {print $1,a[$1],$2}

    Se chegarmos aqui, isso significa que estamos lendo o segundo arquivo: file1 . Se vimos o primeiro campo da linha em file2 , conforme determinado pelo conteúdo da matriz a , então imprimimos uma linha com os valores do campo 2 de ambos os arquivos.

por 08.10.2014 / 06:41
3

Eu gosto da solução awk, mas acho que isso pode ser mais fácil:

sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2

A opção -o substituirá o formato que você selecionará para ser o primeiro campo do primeiro arquivo, o segundo campo do segundo arquivo e o segundo campo do primeiro arquivo.

    
por 08.10.2014 / 09:40