Я не awk
эксперт, поэтому я склонен разбивать вещи на куски, когда это может сделать одна строка.
Я собираюсь предположить, что вы приняли близко к сердцу предыдущий комментарийчто простое независимое от формата решение маловероятно.Вместо этого я применил подход к документированию формата внутри скрипта и нормализации двух форматов ввода.Если появляется третий формат, просто измените сценарий на документ и нормализуйте этот новый формат.
$ cat << EOF > work.sh
#!/usr/bin/env bash
# 1.txt has IDs in the form id=....
grep -x 'id=.*' 1.txt | sed -e 's/^id=//' | sort > 1.txt.ids
# 2.txt has IDs in the form <ID>...</ID>
grep -x '^<ID>.*</ID>' 2.txt | sed -Ee 's-^<ID>(.*)</ID>-\1-' | sort > 2.txt.ids
comm -12 1.txt.ids 2.txt.ids | grep -xf IDs.txt
EOF
Первая команда grep
извлекает строки из 1.txt, которые полностью состоят из 'id = кое-что', затем удаляет 'id =' и сортирует их в файл 1.txt.ids.
Второй grep делает то же самое для строк из 2.txt, которые полностью состоят из ' что-то ', затем удаляет открытые и закрывающие теги ID и сортирует идентификаторы в 2.txt.ids.
comm
используется для отображения только строк, которые появляются в обоих файлах, ивывод comm
дополнительно фильтруется IDs.txt, который представляет собой список конкретных идентификаторов, которые вас интересуют.
$ cat 1.txt
id=foo
name=example
age=81
end
id=notTheIDYouAreLookingFor
name=other
age=null
$ cat 2.txt
<Data>
<ID>foo</ID>
<Stuff>Some things</Stuff>
</Data>
<Data>
<ID>bar</ID>
<Stuff>Other things</Stuff>
</Data>
$ cat IDs.txt
foo
bar
someOtherID
$ bash work.sh
foo