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.