Какой простой способ обрезать 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
, но с другого конца файла.