Это типичная задача для awk
. Вот одно из возможных решений:
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
где file1
- это тот, который в вашем вопросе назван "входным файлом", а file2
- тот, который в вашем вопросе назван "другим файлом". (Обратите внимание на порядок следования файлов в списке)
Пояснение:
Первый командный блок выполняется при считывании первого файла file2
; это достигается с помощью условия NR==FNR
, которое является истинным только при считывании первого файла. Второй командный блок выполняется только для второго файла file1
(из-за директивы next
в первом командном блоке). Первый блок извлекает префикс префикса
и суффикс суффикс
, а суффикс [префект] = суффикс
запоминает для каждого префикса соответствующий суффикс; это необходимо для обращения к этим данным во втором блоке. Во втором блоке фактически выполняются аналогичные команды по извлечению префикса, а также по его использованию для получения из хранимых суффиксов нужного суффикса. Есть только одно отличие, необходимо также сохранить номер после символа #
в составе новых данных префикса, чтобы была выполнена вторая операция совпадения -
; чтобы отличить префикс, необходимый для доступа к массиву суффиксов -
, от префикса, который нужен в составе результирующих данных.