как я могу использовать awk для поиска вперед в файле и удаления строк, если они соответствуют предыдущим 3 строкам - PullRequest
0 голосов
/ 24 октября 2018

Из-за нумерации страниц у меня есть файл, который дублирует строки заголовка, если данные не могут быть напечатаны на текущей странице.Например: H

eading
data1
data2
data3 ...

, а затем внизу страницы:

NEW Heading
Heading line2
Heading line3
; no more room on this page so a new page is generated and duplicates above -
NEW Heading
Heading line2
Heading line3

Так что в основном мне нужно сохранить 3 строки, посмотреть вперед на 3 строки и, если они совпадают, затем удалитьдублировать 3 строки из файла

1 Ответ

0 голосов
/ 25 октября 2018

AWK не может делать добро смотреть вперед вещи.AWK ориентирован на поток.

пример файла:

$ cat example
Heading
data1
data2
data3
NEW Heading
Heading line2
Heading line3
NEW Heading
Heading line2
Heading line3

Не чистое решение взлома AWK (+ сортировка) с использованием ассоциативного массива:

$ awk '{ if ( arr[$0]=="" ) arr[$0]=NR; } END { for (i in arr) print(arr[i] " " i); }' example | sort -n | awk -F'^[0-9]+ ' '{ print($NF); }'
Heading
data1
data2
data3
NEW Heading
Heading line2
Heading line3
  1. присваивает awkномер строки вхождения первой строки в ассоциативный массив.В конце он печатает номер строки и строку, разделенные пробелом.
  2. sort сортирует выходные данные в числовом порядке
  3. awk разбивает на число регулярных выражений пробел и выводит исходную строку

Для чистого раствора GAWK (с использованием сортировки внутри) вы можете изучить:

https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array-Traversal.html#Controlling-Array-Traversal

https://www.gnu.org/software/gawk/manual/html_node/Array-Sorting-Functions.html#Array-Sorting-Functions

...