![Como posso mesclar 2 arquivos linha por linha com o mesmo registro no awk/shell?](https://rvso.com/image/168793/Como%20posso%20mesclar%202%20arquivos%20linha%20por%20linha%20com%20o%20mesmo%20registro%20no%20awk%2Fshell%3F.png)
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 a
se 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 join
pá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.