Mesclando 2 arquivos com base na correspondência de campo

Mesclando 2 arquivos com base na correspondência de campo

Quero criar um arquivo que contenha colunas de dois arquivos de entrada. Arquivo1 é como:

aa 32
bb 15
cc 78

O arquivo2 é:

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

A tarefa é ler o Arquivo1, se o 1º campo de uma linha existir entre o 1º campo do Arquivo2, então imprimir essa linha do Arquivo2, com ambas as colunas e adicionar a 2ª entrada da coluna do Arquivo1 contendo o 1º campo.

A saída deve ser como:

aa 45 32
bb 31 15
cc 50 78

awk é preferido para o script.

Responder1

$ 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:

awkpercorre implicitamente cada arquivo, uma linha por vez. Como o demos file2como primeiro argumento, ele é lido primeiro. file1é lido em segundo lugar.

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

    NRé o número de linhas awklidas até agora e FNRé o número de linhas awklidas até agora do 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, aestá ummatriz associativae a[$1]=$2significa salvar a segunda coluna do arquivo2, denotada $2como um valor na matriz ausando a primeira coluna do arquivo2, $1como chave.

    nextdiz awkpara pular o resto dos comandos e começar de novo com a próxima linha.

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

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

Responder2

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

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

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

Responder3

Junte o segundo arquivo File2ao primeiro arquivo, File1.

join <(sort -k1 file2) <(sort -k1 file1)

informação relacionada