Какой простой способ обрезать N строк из хвоста файла (без использования "головы" )?

Скажем, у меня есть куча файлов длиной > 100 строк. Я хотел бы обрезать верхние 14 строк и нижние 9 строк, оставив только линии посередине. Эта команда обрезает верхнюю четырнадцать:

cat myfile.txt | tail -n +15

Есть ли еще одна команда, которую я могу выполнить, чтобы обрезать нижнюю часть 9 без явной передачи длины файла?

Отредактировано для добавления: Моя версия главы (Mac OS 10.5) не принимает отрицательное число строк в качестве параметра.

Ответ 1

Это будет работать на OS X и может быть немного понятнее, чем пример sed:

< myfile.txt tail -n +15 | tail -r | tail -n +10 | tail -r

Конечно, если вы можете получить доступ к версии GNU head, это можно сделать еще более элегантно:

< myfile.txt tail -n +15 | head -n -9

Знайте, что tail начинается с n-й строки, а head пропускает n строк ввода.

Ответ 2

Вы можете использовать sed:

sed -n -e :a -e '1,9!{P;N;D;};N;ba' myfile.txt

Вы также можете использовать sed для первого 15:

sed '1,15d' myfile.txt

Ответ 3

Используйте отрицательное количество строк с помощью команды head:

cat myfile.txt | head -n  -9

Это печатает все, кроме последних 9 строк.

Ответ 4

То, что сказал jbourque, совершенно правильно. Он просто не был слишком многословным:

cat myfile.txt | tail -n +15 | head -n -9

Ответ 5

Если вы можете распознать последние 9 строк с помощью отличительного шаблона для первой из этих строк, тогда простая команда sed выполнит трюк:

sed -e '1,15d' -e '/distinctive-pattern/,$d' $file

Если вам нужно чистое цифровое смещение снизу, стандартное (в отличие от GNU) sed не поможет, но ed будет:

ed $file <<'!'
1,15d
$-8,$d
w
q
!

Это перезаписывает исходные файлы. Вы должны были бы script, где записывается файл, если вы хотите этого избежать.

Ответ 6

Это также должно работать и делать все в одном процессе:

seq 15 | 
awk -v N=5 '
  { lines[NR % N] = $0 } 
  END { i = NR-N+1; if (i<0) i=0; for (; i <= NR; ++i) print lines[i % N] }'

(seq - простой способ для создания некоторых тестовых данных.)

Ответ 7

Команда head должна делать то, что вы хотите. Это происходит так же, как tail, но с другого конца файла.