Обработка текста: найдите совпадение в середине строки, а затем напечатайте это и строку перед - PullRequest
0 голосов
/ 03 октября 2019

Я хотел бы найти все строки для 2019 года и далее, но только после строки «To:». Все, что находится между "From:" и "To:" не имеет значения.

Я пытался использовать grep с параметрами -A -B, но grep в AIX не имеет этих параметров. Кроме того, я пробовал что-то вроде, но я не могу понять, как напечатать линию перед соответствием, и как искать шаблон в середине строки.

awk '$ 13> = 2019 {print $ 0}' file.txt

В конце я хотел бы найти «2019» в каждой строке за строкой «To:». Например, выходные данные будут выглядеть примерно так:

certificate4 - с: пятница, 16 октября 2009 года, 13:22:18 CEST до: среда, 16 октября, 2019 13:32:16 CEST

1 Ответ

1 голос
/ 04 октября 2019

Догадываясь о том, что имеет в виду ОП:

  • , если строка содержит строку 'To:' и
  • , строка также имеет номер в поле № 15, который является> = 2019 затем
  • вывести предыдущую строку и текущую строку

И некоторые предположения:

  • первая строка в файле может соответствовать
  • последовательных строк могут соответствовать поиску «To: /> = 2019»:
  • для всех интересующих строк «To» ставится перед полем # 15

Выборочные данные основаны исключительно нав одной строке, предоставленной OP:

$ cat -n print15.dat
 1  certificate1 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2019 1:32:16 PM CEST
 2  this is line two
 3  this is line three
 4  certificate4 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2019 1:32:16 PM CEST
 5  this is line five
 6  this is line six
 7  certificate7 - From: Friday, October 16, 2020 1:22:18 PM CEST To: Wednesday, October 16, 2017 1:32:16 PM CEST
 8  this is line eight
 9  this is line nine
10  certificate10 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2020 1:32:16 PM CEST
11  this is line eleven
12  certificate12 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2023 1:32:16 PM CEST
13  certificate13 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2024 1:32:16 PM CEST
14  this is line fourteen

Применяя описанную логику, мы видим, что строки 1, 4, 10, 12 и 13 соответствуют 'To: ./> = 2019'.

One awk решение:

$ awk '/To:/ && $15 >= 2019 { printf "\n#############\n"
                              if (length(prevline) > 0) { print prevline }
                              print $0
                              printf   "#############\n"
                            }
                            { prevline=$0 }
' print15.dat

Объяснение:

  • /To:/ && $15 >= 2019: сопоставляет любую строку с шаблонами 'To:' и полем # 15> = 2019 (предоставленоэто не означает, что 'To:' стоит перед полем # 15)
  • print/########: простой заголовок / трейлер для визуального различения наборов совпадающих строк
  • if/length/print: еслиПредварительная линия непусто, затем выведите его
  • print $0: вывести текущую строку (соответствует 'To:' и $ 15> = 2019)
  • prevline=$0: установить переменную prevline в текущей строке(будет использоваться как «предыдущая строка» для следующей обрабатываемой строки)

И вывод:

#############
certificate1 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2019 1:32:16 PM CEST
#############

#############
this is line three
certificate4 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2019 1:32:16 PM CEST
#############

#############
this is line nine
certificate10 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2020 1:32:16 PM CEST
#############

#############
this is line eleven
certificate12 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2023 1:32:16 PM CEST
#############

#############
certificate12 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2023 1:32:16 PM CEST
certificate13 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2024 1:32:16 PM CEST
#############
...