Você pode usar o comando join
para isso. Ele mescla dois arquivos com base em um campo comum. Aqui está um exemplo usando bash
(eu quebrei as linhas para legibilidade):
join -t , \
<(awk '{ print NR","$0; }' file2.txt | sort -k 1b,1 -t ,) \
<(awk '{ print $1","$2; }' file1.txt | sort -k 1b,1 -t ,) \
| cut -d , -f 2- \
| column -t -s ,
Saída:
( l 0 p a$1 123456789
( l 0 p a$1 abcde
=2 3 x5 x4 00000
=2 3 x5 x4 123456789
&a”s?m!a abcdefgh
Algumas explicações:
- Para simplificar a maneira como os campos e as colunas são manipulados, o primeiro passo é normalizar o caractere separador. Aqui,
,
é usado para isso.
-
awk
é usado para normalizar o separador file1.txt
.
- Como
file2.txt
não tem um campo explícito para unir as linhas, awk
é usado para adicionar o número da linha a cada linha.
- Por padrão,
join
usa o primeiro campo de cada arquivo para unir os arquivos. Portanto, não há necessidade de especificar qual campo deve ser usado. Observe que -t
é fornecido indicando que os campos estão separados por ,
.
-
join
espera que os dois arquivos de entrada sejam classificados, portanto sort
é usado para garantir que a ordem padrão esperada por join
seja usada.
-
<( some_command )
cria pipes nomeados anônimos. Basicamente, nos permite usar saídas de comando como arquivos.
-
cut
é usado para remover o campo do número da linha da saída.
- E por último,
column
é usado para formatar a saída como uma tabela ( -t
). Para evitar mexer nos dados de file2.txt
, ,
é usado como separador ( -s ,
).