Como posso mesclar 2 arquivos linha por linha com o mesmo registro no awk/shell?

Como posso mesclar 2 arquivos linha por linha com o mesmo registro no awk/shell?

Sou novo no awk e no shell, me perguntando como posso mesclar 2 arquivos com a linha que possuem o mesmo registro usando shell/awk? arquivo1 e arquivo2 podem ter ordem diferente para o nome. Quero apenas mesclar as linhas que possuem o mesmo registro. por favor ajude.

file1.txt
Mary 68 
Tom 50 
Jason 45
Lu 66

file2.txt
Jason 37
Tom 26
Mary 74
Tina 80

mergefile.txt
Marry 68 74
Tom 50 26
Jason 45 37 

Eu tentei o awk, mas leva algum tempo para executar o script. Querendo saber se poderia haver um implemento mais rápido e simples.

cat file1.txt | while read line
do
    score1=$( echo $line | awk '{print $2}');
    name1=$( echo $line | awk '{print $1}');

    cat file2.txt | while read l
    do
        score2=$( echo $l | awk '{print $2}');
        name2=$( echo $l | awk '{print $1}');
        if [[ $name1 == $name2 ]]
        then
            echo "$name1 $score1 $score2" >> mergefile
            break
        fi
    done
done

Responder1

Se você quiser usar o awk:

$ awk 'NR==FNR {a[$1] = $2; next} $1 in a {print $1, $2, a[$1]}' file2.txt file1.txt 
Mary 68 74
Tom 50 26
Jason 45 37

Nenhuma classificação é necessária e a saída estará na ordem do segundo arquivo fornecido.

Explicação:

  • NR==FNRé a maneira canônica de selecionar registros do primeiro arquivo nomeado
  • {a[$1] = $2; next}preencher uma matriz com chaves do primeiro campo e valores do segundo
  • $1 in ase o primeiro campo já foi visto no primeiro arquivo; então
  • {print $1, $2, a[$1]}imprima a chave e o valor do segundo arquivo e o valor do primeiro

Responder2

Isso soa como um trabalho parajoin, o operador de banco de dados relacional

join <(sort file1.txt) <(sort file2.txt)

Testes

$ cat file1.txt
Mary 68
Tom 50
Jason 45
Lu 66

$ cat file2.txt
Jason 37
Tom 26
Mary 74
Tina 80

$ join <(sort file1.txt) <(sort file2.txt)
Jason 45 37
Mary 68 74
Tom 50 26

joiné uma ferramenta padrão especificada em POSIX.

A joinpágina de manual afirma:

The files file1 and file2 shall be ordered in the collating sequence of sort -b on the 
fields on which they shall be joined, by default the first in each line. All selected 
output shall be written in the same collating sequence.

informação relacionada