Мне нужно извлечь строку над строкой поиска (скажем, 19 строк выше).Обычно, я бы просто пошел с
grep -B 19 $search_string $file | ...further processing
Однако скрипт должен работать и в Solaris, где grep не предоставляет опцию -B .Часто я могу использовать awk '/begin/,/end/'
, чтобы напечатать несколько строк, если я знаю предыдущие строки.В этой конкретной ситуации это невозможно.Я попробовал следующее:
1) Решение кольцевого буфера.
#!/bin/bash
g_a_buffer=( 0 )
g_i_buffer_index=1
while read line
do
g_a_buffer[$((g_i_buffer_index % 20))]=$line
echo $line|grep $search_string > /dev/null
[ $? -eq 0 ] && echo ${g_a_buffer[$(( (g_i_buffer_index + 2) % 20))]}
let "g_i_buffer_index += 1"
done < $file_name
Это очень медленно .Для ~ 40 тыс. Строк требуется 1 м37 с (против 0,005 с grep)
2) Решение Awk.Я должен прямо сказать, что я начинающий экстремал в awk, редко выходя за рамки awk '{print $ 1}'. Следующая строка не работает , но дает вам представление о том, чего я пытаюсь достичь:
awk '/mySearchString/ {print NR-19}' filename.txt
0,118 для выполнения, скорость хорошая!Но все, что я получаю, это номер строки - 19. Мне нужна распечатка строки, расположенной в (строка - 19).После некоторого поиска, я все еще не мог найти ответ.Я признаю, что это, должно быть, очень простая проблема, но я, кажется, тут попал в стену.
Все, что я нашел до сих пор, - это как напечатать предыдущую строку с помощью awk (что-то вроде буфера в 1 строку)или массивные реализации с кольцевым буфером, но в awk.Есть ли более элегантный способ сделать это?
Спасибо за помощь!