Как я могу отфильтровать поиск в стиле grep, чтобы 3 строки находились в заданном порядке и на расстоянии? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть файл, из которого я хочу посмотреть, существуют ли 3 определенные строки в ограниченном диапазоне строк.

Первые 2 всегда будут сразу после друг друга, а третья будет Х числом строкпосле # 2.# 3 также может существовать более одного раза, но мне нужен только первый.

Например,

nope    
nope
foo    
bar    
nope
nope
nope
nope
baz
nope
baz (ignore this one)

Если foo и bar существуют сразу после друг друга и базируются в пределах, скажем, 100 строк, я"выиграть".Как я могу легко добиться этого?

Сейчас я разбил его на множество маленьких шагов, создавая временные файлы с помощью grep -A100 (и других программных средств grep) всякий раз, когда я нахожу "foo", а затем проверяю их на "Бар "и" Баз ".Это работает, но это не красиво.

1 Ответ

0 голосов
/ 19 февраля 2019

Не используйте grep здесь вообще: awk - правильный инструмент для работы.

awk -v range=100 '
BEGIN { matchedFoo = seenFoo = seenBar = (0 - range) }
/foo/ { seenFoo=NR }
/bar/ { if (seenFoo == NR-1) { seenBar=NR; matchedFoo=seenFoo; } }
/baz/ && (seenBar > (NR - range)) {
  print("Matched foo@" matchedFoo ", bar@" seenBar ", baz@" NR);
  exit(0);
}
'

... испускает, с вашим вводом образца:

Matched foo@3, bar@4, baz@9

... правильно выдает номера строк для нужных экземпляров.(Конечно, вы можете хранить полные строки в дополнение к числам, если хотите).


Быстрое слово в логике:

  • Причина, по которой мы разделилиseenFoo и matchedFoo переменные таковы, что новый foo без следующего bar не изменяет номера строк, показанные в выходных данных.
  • Причина, по которой мы инициализируем все в 0 - range, заключается в том, чтозначения по-прежнему являются действительными целыми числами (так что математическая ошибка не получается), но также baz в первых range строках ввода не видит значение 0 как означающее совпадение для bar встрока 0, и, следовательно, в пределах нашего 100-строчного поискового расстояния.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...