Com base no arquivo de exemplo, resposta da steeldriver
(usando uma tabela de pesquisa / matriz associativa em awk
)
é provavelmente a melhor solução.
Embora seja geralmente desaconselhável, você pode fazer a mesma coisa puramente no bash:
declare -A id
while IFS=" ," read x idnum xx name
do
id[$name]=$idnum
done < file1
while read name
do
printf '%s %s\n' "${id[$name]}" "$name"
done < file2
A lógica é a mesma:
- Um primeiro passo, que cria um array,
indexados por valores de nome, contendo valores de ID.
- Um segundo passe, que mapeia nomes para IDs e os exibe lado a lado.
Minha resposta funciona conforme desejado (por exemplo, conforme especificado)
para os dados de amostra na pergunta.
(Desde que usa uma matriz - especificamente, uma matriz associativa -
requer bash (ou ksh, zsh ou yash);
matrizes não são especificadas pela especificação POSIX para o shell,
e não estão disponíveis em todos os shells que são usados no Unix / Linux.)
Por causa da maneira como o comando read
do bash funciona,
minha resposta também lida com nomes de várias palavras (ou seja, nomes com espaços neles)
como se poderia esperar intuitivamente:
file1 file2 output
ID: 42, Name: fat cat fat cat 42 fat cat
ID: 95, Name: Superman under dog 83 under dog
ID: 83, Name: under dog spider man ⟹ 17 spider man
ID: 9, Name: cat woman spider pig 60 spider pig
ID: 17, Name: spider man Superman 95 Superman
ID: 60, Name: spider pig cat woman 9 cat woman
Observe que as duas respostas diferenciam maiúsculas e minúsculas;
por exemplo, foo1.bar.com
não corresponderia a Foo1.bar.com
.