Esta é uma tarefa típica para awk . Aqui está uma solução possível:
awk '
NR==FNR {
match($0,/.*\$/)
pref = substr($0,RSTART,RLENGTH)
rest = substr($0,RSTART+RLENGTH)
suff = substr(rest, index(rest,"|"))
suffixes[pref] = suff
next
}
{
match($0,/.*\$/)
prefix = substr($0,RSTART,RLENGTH)
match($0,/.*\$[0-9]+|/)
data = substr($0,RSTART,RLENGTH)
if (prefix in suffixes)
print data suffixes[prefix]
}
' file2 file1
em que file1 é o nome "arquivo de entrada" em sua pergunta e file2 o nome "outro arquivo" em sua pergunta. (Mente a ordenação dos arquivos na lista.)
Explicação:
O primeiro bloco de comando é executado durante a leitura do primeiro arquivo file2 ; isso é obtido pela condição NR==FNR , que é válida apenas enquanto o primeiro arquivo é lido. O segundo bloco de comandos é executado apenas para o segundo arquivo file1 (por causa da diretiva next no primeiro bloco de comando). O primeiro bloco extrai o prefixo pref e o sufixo suff , e suffixes[pref] = suff memoriza para cada prefixo o sufixo correspondente; isso é necessário para se referir a esses dados no segundo bloco. No segundo bloco, existem comandos semelhantes executados para extrair o prefixo e usá-lo para obter dos sufixos armazenados o sufixo correto. Há apenas uma outra diferença; você também precisa manter o número após o símbolo # como parte de seus novos dados de prefixo, portanto, há uma segunda operação match ; para distinguir o prefixo necessário para acessar a matriz suffixes do prefixo que é necessário como parte dos dados do resultado.