Пропустите первые 6 строк / строк в текстовом файле с помощью awk

39

Как я могу пропустить первые 6 строк / строк в текстовом файле (input.txt) и обработать остальные с помощью awk? Формат моего сценария awk (program.awk):

BEGIN {
} 

{ 
process here
} 

END {

}

Мой текстовый файл выглядит так:

0
3
5
0.1 4.3
2.0 1.5
1.5 3.0
0.3 3.3
1.5 2.1
.
.
.

Я хочу обработать файл, начиная с:

0.3 3.3
1.5 2.1
.
.
.
amatek
источник

Ответы:

60

Используйте любой из двух шаблонов:

NR>6 { this_code_is_active }

или это:

NR<=6 { next }
{ this_code_is_active }

Используйте FNR вместо NR, если у вас есть много файлов в качестве аргументов для awk и вы хотите пропустить 6 строк в каждом файле.

Janis
источник
29

Пытаться:

awk 'FNR > 6 { #process here }' file
cuonglm
источник
4
Хорошо! Но вы не объяснили, почему это лучше - для нескольких файлов FNR- номер строки в каждом файле, а NRномер для всего ввода (не проблема при передаче по трубопроводу).
Томаш Гандор
3

Вы также можете пропустить произвольное количество строк в начале или конце файла с помощью headили tailпрограмм.

Для вашего конкретного вопроса,

tail input.txt -n+7 | program.awk

будет делать, если ваш program.awkфайл исполняемый. В противном случае вы можете использовать

tail input.txt -n+7 | awk -f program.awk

Таким образом, вы сэкономите сравнение для каждой строки, и вам не нужно менять логику вашего кода AWK.

tail начнется потоковая передача текста, начиная с седьмой строки, пропуская шесть первых строк.

Это не будет иметь большого значения в производительности, особенно если текстовый процесс прост благодаря кэшированию. Однако для длинных файлов и многократного использования в облачной среде может сэкономить некоторая стоимость.

Доктор Windows
источник
Правильно, но, как правило, следует избегать трубопроводов, когда вы можете легко сделать это одним инструментом. Подумайте об огромном текстовом файле, проходящем через обе команды, чтобы удалить несколько строк.
Филиппос