голова; голова
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
С помощью вышеприведенного вы можете указать первое число строк для удаления заголовка выходных данных с первой headкомандой и количество строк для записи outfileсо второй. Это также обычно делает это быстрее, чем, sedособенно когда ввод велик, несмотря на то, что требуется два вызова. Где sedопределенно должны быть предпочтительными , хотя, в том случае, если <infileэто не обычный, lseekable файл - потому что это будет , как правило , не работают как положено в этом случае, но sedможет обрабатывать все модификации выходных в одном, сценарном процессе.
С GNU headвы также можете использовать -отрицательную форму для [num]второй команды. В этом случае следующая команда удалит первую и последнюю строки из ввода:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
ИЛИ с POSIX sed:
Скажем, например, я читал ввод из 20 строк, и я хотел убрать первые 3 и последние 7. Если бы я решил сделать это w / sed, я бы сделал это с хвостовым буфером. Я бы сначала сложил три и семь для общего количества полос десять, а затем сделал бы:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Это пример, который удаляет первые 3 и последние 7 строк из ввода. Идея состоит в том, что вы можете буферизовать столько строк, сколько хотите, чтобы вырезать их из хвоста ввода в пространстве шаблонов в стеке, но только Pнабирать первую из них для каждой извлеченной строки.
- В строках
1,10 sed Pничего не печатается, потому что для каждого из них он укладывает входные данные в шаблонное пространство построчно в bцикле ранчо.
- На 3-й строке все
sedстеки 'ы dвыбраны - и поэтому первые 3 строки удаляются из вывода одним махом.
- Когда
sedдостигает $последней строки ввода и пытается выдвинуть Next, он достигает EOF и полностью останавливает обработку. Но в то время пространство образца содержит все линии 14,20- ни одна из которых еще не была Pнабрана и никогда не была.
- На каждой другой строке
sed Pпечатается только до первой \nвстречной линии в пространстве шаблона и Dвыбирается одинаково перед началом нового цикла с тем, что осталось - или следующими 6 строками ввода. Седьмая строка снова добавляется в стек командой Next в новом цикле.
И так, из seqвыходных данных (то есть 20 последовательно пронумерованных строк) , sedтолько печатает:
4
5
6
7
8
9
10
11
12
13
Это становится проблематичным, когда число строк, которые вы хотите вырезать из хвоста ввода, велико - потому что sedпроизводительность прямо пропорциональна размеру пространства шаблонов. Тем не менее, во многих случаях это жизнеспособное решение - и POSIX sedзадает пространство шаблонов для обработки не менее 4 КБ перед перебором.