Есть ли способ (POSIX командной строки) для печати всего файла EXCEPT последних n строк? Используйте случай, у меня будет несколько файлов неизвестного размера, все из которых содержат нижний колонтитул шаблона известного размера, который я хочу удалить. Мне было интересно, есть ли уже утилита, которая делает это, прежде чем писать сам.
Хвост инвертирует/печатает все, кроме последних n строк?
Ответ 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)