, Как к пропуск N строки
, когда образец будет найден в awk?
awk '{if ($0~/pattern/) skip N lines; else print $0}'
Позвольте мне показать вам, как сделать это 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
N = количество строк для пропуска
awk '{if ($0~/pattern/) {n=NR+N;} if (NR<n) next; print $0;}'