Простое (GNU) sed
решение. Файлы читаются только один раз. Предполагается, что символы в File_1 не нужно заключать в кавычки в выражении sed.
pat=$(sed ':a; $!{N;ba;}; y/\n/|/' File_1)
sed -E -n ":a; /^>($pat)/{:b; p; n; /^>/ba; bb}" File_2
Объяснение: Первый вызов sed
генерирует регулярное выражение, которое будет использоваться в второй вызов sed
и сохраняет его в переменной pat
. Цель состоит в том, чтобы избежать многократного чтения всего File_2 для каждой строки File_1. Он просто "проглатывает" File_1 и заменяет символы новой строки |
символами. Таким образом, образец File_1 становится строкой со значением a|c|d
. Регулярное выражение a|c|d
соответствует, если совпадает хотя бы одна из альтернатив (a
, b
, c
для этого примера) (это расширение GNU sed).
Второй sed
выражение, ":a; /^>($pat)/{:b; p; n; /^>/ba; bb}"
, можно преобразовать в псевдокод следующим образом:
begin:
read next line (from File_2) or quit on end-of-file
label_a:
if line begins with `>` followed by one of the alternatives in `pat` then
label_b:
print the line
read next line (from File_2) or quit on end-of-file
if line begins with `>` goto label_a else goto label_b
else goto begin