Что является самым простым способом удалить 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
Спасибо Игорь Фобия за комментарий!