голова; голова
{ 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
достигает $
последней строки ввода и пытается выдвинуть N
ext, он достигает EOF и полностью останавливает обработку. Но в то время пространство образца содержит все линии 14,20
- ни одна из которых еще не была P
набрана и никогда не была.
- На каждой другой строке
sed
P
печатается только до первой \n
встречной линии в пространстве шаблона и D
выбирается одинаково перед началом нового цикла с тем, что осталось - или следующими 6 строками ввода. Седьмая строка снова добавляется в стек командой N
ext в новом цикле.
И так, из seq
выходных данных (то есть 20 последовательно пронумерованных строк) , sed
только печатает:
4
5
6
7
8
9
10
11
12
13
Это становится проблематичным, когда число строк, которые вы хотите вырезать из хвоста ввода, велико - потому что sed
производительность прямо пропорциональна размеру пространства шаблонов. Тем не менее, во многих случаях это жизнеспособное решение - и POSIX sed
задает пространство шаблонов для обработки не менее 4 КБ перед перебором.