Подтвердить что ты не робот

Хвост инвертирует/печатает все, кроме последних n строк?

Есть ли способ (POSIX командной строки) для печати всего файла EXCEPT последних n строк? Используйте случай, у меня будет несколько файлов неизвестного размера, все из которых содержат нижний колонтитул шаблона известного размера, который я хочу удалить. Мне было интересно, есть ли уже утилита, которая делает это, прежде чем писать сам.

4b9b3361

Ответ 1

Большинство версий head (1) - GNU, полученных, в частности, но не связанных с BSD, имеют функцию, чтобы сделать это. Он покажет верхнюю часть файла, кроме конца, если вы используете отрицательное число для количества строк для печати. ​​

Так же:

head -n -10 textfile

Ответ 2

Вероятно, менее эффективен, чем метод "wc" + "делать математику" + "хвост", но проще смотреть на:

tail -r file.txt | tail +NUM | tail -r

Где NUM - это больше, чем количество конечных строк, которые вы хотите удалить, например. +11 будет печатать все, кроме последних 10 строк. Это работает на BSD, который не поддерживает синтаксис head -n -NUM.

Ответ 3

Утилита head - ваш друг.

На странице руководства head:

-n, --lines=[-]K
     print the first K lines instead of the first 10;
       with the leading `-', print all but the last K lines of each file

Ответ 4

Нет стандартных команд для этого, но вы можете использовать awk или sed для заполнения буфера из N строк и печатать из головы после его полного заполнения. Например. с awk:

awk -v n=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file

Ответ 5

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

sed '/FIRST_LINE_OF_FOOTER/q' filename

Это печатает первую строку нижнего колонтитула; если вы хотите этого избежать:

sed -n '/FIRST_LINE_OF_FOOTER/q;p' filename

Это может быть более надежным, чем подсчет строк, если размер нижнего колонтитула изменится в будущем. (Или это может быть менее надежным, если изменяется первая строка.)

Другой вариант, если ваша система head не поддерживает head -n -10, должна прекомпретировать количество строк, которые вы хотите показать. Следующее зависит от bash -специфического синтаксиса:

lines=$(wc -l < filename) ; (( lines -= 10 )) ; head -$lines filename

Обратите внимание, что синтаксис head -NUMBER поддерживается некоторыми версиями head для обратной совместимости; POSIX разрешает только форму head -n NUMBER. POSIX также допускает, чтобы аргумент -n был положительным десятичным целым; head -n 0 не обязательно является необязательным.

POSIX-совместимое решение:

lines=$(wc -l < filename) ; lines=$(($lines - 10)) ; head -n $lines filename

Если вам нужно иметь дело с древними оболочками pre-POSIX, вы можете подумать об этом:

lines=`wc -l < filename` ; lines=`expr $lines - 10` ; head -n $lines filename

Любой из них может делать нечетные вещи, если файл имеет длину 10 или менее строк.

Ответ 6

Это просто. Вы должны добавить + к числу строк, которые вы хотели бы избежать.

Этот пример дает вам все строки, кроме первых 9

tail -n +10 inputfile

(да, не первые 10... потому что он считает разные... если вы хотите 10, просто введите tail -n 11 inputfile)