Какой простой способ вырезать N строк из хвоста файла (без использования 'head')? - PullRequest
10 голосов
/ 07 января 2009

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

cat myfile.txt | tail -n +15

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

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

Ответы [ 7 ]

14 голосов
/ 07 января 2009

Это будет работать на 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 строк ввода.

4 голосов
/ 07 января 2009

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

cat myfile.txt | head -n  -9

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

4 голосов
/ 07 января 2009

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

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

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

sed '1,15d' myfile.txt
2 голосов
/ 07 января 2009

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

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

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

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

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

2 голосов
/ 07 января 2009

То, что сказал Джбурк, совершенно верно. Он просто не слишком много говорил об этом:

cat myfile.txt | tail -n +15 | head -n -9
0 голосов
/ 09 января 2009

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

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 - это простой способ получения некоторых тестовых данных.)

0 голосов
/ 07 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...