Что является самым простым способом удалить 1-ю и последнюю строку из файла с awk?

Я изучаю awk/gawk. В последнее время я просто пытаюсь решить любую проблему с ним, чтобы получить больше возможностей для практики.

Мой коллега вчера задал вопрос,

"как удалить первую и последнюю строку из файла"

. Я знаю, что sed '1d;$d' file будет работать. также head/tail работает даже при низкой производительности. Я сказал ему, что он был счастлив.

Позже я пытался написать однострочный awk: до сих пор я получил:

awk 'NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}'

Это сохранит весь массив в массиве, чтобы пропустить последнюю строку. Я чувствую, что должен быть более простой (или лучший) способ сделать это.

(если нет более простого или более быстрого или лучшего способа, я бы удалил вопрос)

спасибо.

Ответы

Ответ 1

Это трюк:

awk 'NR>2 {print last} {last=$0}'

awk выполняет действие print last только при NR > 2 (то есть во всех строках, кроме первых 2). Во всех строках он устанавливает переменную last в текущую строку. Поэтому, когда awk читает третью строку, она печатает строку 2 (которая хранилась в last). Когда он читает последнюю строку (строка n), он печатает содержимое строки n-1. Чистым эффектом является то, что печатаются строки от 2 до n-1.

Ответ 2

Позвольте мне предложить другое решение. Если вам нужны пользовательские N для верхней и нижней строк, вы можете использовать команды хвост и head:

awk '{print $1}'  | head -n -1 | tail -n+2

head -n-1 - удаляет последнюю строку

tail -n + 2 - запускает вывод из второй строки (удаляет 1 строку)

Следующая команда удалит 3 строки сверху и снизу:

awk '{print $1}'  | head -n -3 | tail -n +4

На самом деле нам даже не нужен awk:

more | head -n -1 | tail -n +2

или

cat | head -n -1 | tail -n +2

Спасибо Игорь Фобия за комментарий!