Вот демонстрация способа печати некоторых символов, предшествующих шаблону:
echo 'abcdefghijklmnopqrstuvwxyz' |
awk 'BEGIN {pat = "jkl"; n = 5}
pat {
i = index($0,pat);
print substr($0, i-n, n + length(pat))
}'
Вывод (пять символов перед "jkl" и "jkl"):
efghijkl
Если в ваших данных есть новые строки, а последовательность символов, которую вы хотите вывести, охватывает новые строки, вам нужно будет накапливать строки, удалять новые строки и сохранять достаточное количество символов в буферной переменной, чтобы вы могли их выводить.
Для чего это стоит, вот упрощенная версия вашего скрипта. Он может работать неправильно, но он более читабелен и более AWKish. Я ничего не сделал с ним, чтобы попытаться заставить его выполнять необходимые функции, и я не проверял его.
awk '
/>/ {head = $0; getline}
/pattern/ print head "\n" $0
' filename1 |
awk '
BEGIN {pos = 0; char = 0}
/>/) {head = $0; getline}
{
pos = 0;
if ($0 ~ /pattern/) {
pos = match($0, /pattern/); char = substr($0, pos, 55)
}
print head "\n" char
}'