2

Как сделать так, чтобы grep игнорировал первые N совпадений в файле, затем печатал (N+1)-ное совпадение и все k строк после него, а затем завершал работу.

3 ответа3

3

Просто отправьте результат в tail(1). Например, если N равно 10, используйте tail +11 чтобы пропустить первые 10 совпадений:

grep pattern file | tail +11
2

Альтернативное решение в awk:

awk '/pattern/ { found++ } found > N && printed <= K { print; printed++ }' file

Более читабельно:

awk '
# Initialize to zero for clarity
BEGIN {
  found = 0
  printed = 0
}

# Check for a pattern match
/pattern/ {
  found++
  # Found one match
}

# Check if it's the right time to print
found > N && printed <= K {
  print
  printed++
  # Printed once
}' file

Убедитесь, что вы заполнили pattern , N и K мере необходимости.

Первый блок будет отслеживать каждый раз, когда образец найден. Как только это пройдет порог N , второй блок начинает печатать каждую строку. Второй блок прекратит печать, как только будет достигнут порог K

0

вы можете использовать awk

awk 'd && k--&&k>=0; c>=3 && /pattern/{d=1;k=2} /pattern/{c++};' file

Сначала /3/{c++} увеличивает значение c каждом совпадении с шаблоном. Например, если c достигнет значения 3, установите флаг (d) и установите количество строк после него (k=2). d && k--&&k>=0 означает, что, если значение k больше 0 и меньше 2 , выведите строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .