awk, если находят образец, пропускают n строки

, Как к пропуск N строки , когда образец будет найден в awk?

awk '{if ($0~/pattern/) skip N lines; else print $0}'
5
задан 12 February 2021 в 09:53

2 ответа

Позвольте мне показать вам, как сделать это awk-решение более идиоматическим (обратитесь к странице awk info page on stackoverflow).

Начиная с:

$ seq 10 20 | awk '{if ($0 ~ /11/) {n=NR+6}; if (NR<n) next; print $0}'
10
17
18
19
20

Сначала возьмем утверждения if и превратим их в condition {action} lines

awk '
    $0 ~ /11/ {n=NR+6}
    NR < n {next}
    {print $0}
'

Затем для некоторых вещей используем $0 в качестве значения по умолчанию:

awk '
    /11/ {n=NR+6}
    NR < n {next}
    {print}
'

Затем возьмем {принт} в качестве действия по умолчанию, если условие истинно

awk '
    /11/ {n=NR+6}
    NR < n {next}
    1
'

Затем перевернем условие NR < n, чтобы удалить следующий

awk '
    /11/ {n=NR+6}
    NR >= n
'

и сможем сделать его однолинейным:

awk '/11/ {n=NR+6} NR >= n'

В результате получим тот же вывод

$ seq 10 20 | awk '/11/ {n=NR+6} NR >= n'
10
17
18
19
20

Сравнение:

awk '{if ($0 ~ /11/) {n=NR+6}; if (NR<n) next; print $0}'
awk '/11/ {n=NR+6} NR >= n'

В качестве последнего шага, возможно, вы захотите передать паттерн и значение N в качестве параметров в awk, чтобы их не нужно было жестко закодировать. Это раздувает вызов awk, но может быть более гибким для вас:

awk -v patt="11" -v N=6 '$0 ~ patt {n = NR + N} NR >= n'

Поместив параметры после скрипта awk, -v можно сбросить, сделав команду немного короче:

awk '$0 ~ patt {n = NR + N} NR >= n' patt=11 N=6

Одним из преимуществ размещения переменных после тела awk является то, что они могут получить разные значения для каждого файла:

awk '$0 ~ patt {n = NR + N} NR >= n' patt=11 N=6 file1 N=10 file2
9
ответ дан 18 March 2021 в 23:38

N = количество строк для пропуска

awk '{if ($0~/pattern/) {n=NR+N;} if (NR<n) next; print $0;}'
2
ответ дан 18 March 2021 в 23:38

Другие вопросы по тегам:

Похожие вопросы: