cabeza; cabeza
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
Con lo anterior, puede especificar el primer número de líneas para eliminar del encabezado de la salida con el primer head
comando, y el número de líneas para escribir outfile
con el segundo. Por lo general, también lo hará más rápido que sed
, especialmente cuando la entrada es grande , a pesar de requerir dos invocaciones. Donde sed
sin duda debe ser preferido, sin embargo, es en el caso de que <infile
es no un habitual, lseekable archivo - porque esto normalmente no funciona como es debido, en ese caso, pero sed
puede manejar todas las modificaciones de salida en un solo proceso, con guión.
Con un GNU head
también puede usar la -
forma negativa [num]
en el segundo comando. En cuyo caso, el siguiente comando eliminará la primera y última línea de la entrada:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
O con un POSIX sed
:
Digamos, por ejemplo, que estaba leyendo una entrada de 20 líneas y quería eliminar las primeras 3 y las últimas 7. Si resolviera hacerlo con / sed
, lo haría con un buffer de cola. Primero sumaría tres y siete para un recuento total de diez y luego hago:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Ese es un ejemplo que elimina las primeras 3 y las últimas 7 líneas de la entrada. La idea es que puede almacenar tantas líneas como desee de la cola de entrada en el espacio del patrón en una pila, pero solo P
borre la primera de estas para cada línea extraída.
- En las líneas
1,10
sed
P
no hay nada porque para cada una de ellas está apilando la entrada en el espacio del patrón línea por línea en un b
bucle de rancho.
- En la tercera línea,
sed
se d
elige toda la pila , por lo que las primeras 3 líneas se eliminan de la salida de una sola vez.
- Cuando
sed
llega a la $
última línea de entrada e intenta extraer la N
extensión, golpea EOF y detiene el procesamiento por completo. Pero en ese momento el espacio del patrón contiene todas las líneas 14,20
, ninguna de las cuales ha sido P
borrada y nunca lo ha sido.
- En cualquier otra línea, se
sed
P
alinea solo hasta la primera línea de flujo que ocurre \n
en el espacio del patrón, y D
elige lo mismo antes de comenzar un nuevo ciclo con lo que queda, o las siguientes 6 líneas de entrada. La séptima línea se agrega nuevamente a la pila con el N
comando ext en el nuevo ciclo.
Y así, de seq
la salida de (que es 20 líneas numeradas secuencialmente) , sed
solo imprime:
4
5
6
7
8
9
10
11
12
13
Esto se vuelve problemático cuando el número de líneas que desea eliminar de la cola de entrada es grande, porque sed
el rendimiento es directamente proporcional al tamaño de su espacio de patrón. Aún así, sin embargo, es una solución viable en muchos casos, y POSIX especifica un sed
espacio de patrón para manejar al menos 4 kb antes de reventar.