Imagine una salida de un comando como
44444
55555
11111
22222
33333
¿Cómo puedo tirar de las primeras N líneas (las dos primeras en el ejemplo anterior) y agregarlas al final, pero sin usar el archivo temporal (por lo que solo uso tuberías)?
11111
22222
33333
44444
55555
Algo en la línea de | sed -n '3,5p;1,2p'
(que obviamente no funciona ya que sed no se preocupa por el orden de los comandos).
command-line
text-processing
Peter Uhnak
fuente
fuente
Respuestas:
Simplemente copie esas líneas en el búfer de retención (luego bórrelas) y cuando esté en la última línea agregue el contenido del búfer de retención al espacio del patrón:
Con
gnu sed
usted podría escribirlo comoAquí hay otra forma con ol '
ed
(r
dirige la salidasome command
al búfer de texto y luegom
alinea1,NUMBER
las líneas después de la$
última):Tenga en cuenta que, como se señaló, ambos fallarán si la salida tiene menos de
NUMBER
+1 líneas. Un enfoque más sólido sería (gnu sed
sintaxis):este solo elimina líneas en ese rango siempre que no sean la última línea (
$!d
); de lo contrario, sobrescribe el espacio del patrón con el contenido del búfer de retención (g
) y luegoq
uits (después de imprimir el espacio del patrón actual).fuente
sed -e '1,NUMBER{H;1h;d;}' -e '$G'
también funciona de forma portátil (tenga en cuenta que algunassed
implementaciones no pueden contener más de unos pocos kilobytes en el espacio de espera, por lo que NUMBER no puede ser demasiado grande allí)sed -e '1,NUMBER{H;1h;d' -e'}' -e '$G'
?-e
reemplaza a una nueva línea.d;}
Todavía no es POSIX pero es portátil. Eso se solucionará en la próxima especificación POSIX. Ver austingroupbugs.net/view.php?id=944#c27201,NUMBER{H;1h;d;}
no tener un punto y coma inmediatamente después de la llave de apertura . Sinsed
embargo, eso podría haber sido un error en SunOS 4.1 cuya solución aún está conectada a mis dedos 20 años después.Un
awk
enfoque:Un beneficio sobre el
sed
enfoque de @ don_crissti es que todavía funciona (genera las líneas) si la salida tienen
líneas o menos.fuente
\n
con ORS, para que esto funcione con otros separadores de registros (digamos que desea usar párrafos, etc.).Tengo
xclip
y con esto esto se puede hacer de esta manera:Aquí está su descripción:
fuente
Una manera Perl:
O, lo mismo escrito menos crípticamente:
Por ejemplo:
Explicación
-ne
: lea el archivo / flujo de entrada línea por línea y aplique el script dado por-e
a cada línea.$.<3
:$.
es el número de línea actual, así que cambie3
al número de líneas que desea desplazar.$.<3?($f.=$_):print;
: este es el operador condicional, el formato general escondition ? case1 : case2
, se ejecutarácase1
sicondition
es verdadero ycase2
si es falso. Aquí, si el número de línea actual es menor que 3, agrega la línea actual ($_
) a la variable$f
y, si el número de línea es mayor que 3, se imprime.}{ print $f
:}{
es la abreviatura de perl paraEND{}
. Se ejecutará después de que se hayan procesado todas las líneas de entrada. En este punto, habremos reunido todas las líneas que queremos cambiar y habremos impreso todas las que queremos dejar solas, así que imprima las líneas guardadas como$f
.fuente
perl -ne '$.<3?$f.=$_:print}{print $f
Utiliza POSIX
ex
. Sí, está destinado a la edición de archivos, pero funcionará en una tubería.Esto puede tener cualquier comando arbitrario agregado al principio o al final de la tubería y funcionará igual. Mejor aún, dada la presencia de
/dev/stdin
, es compatible con POSIX.(No sé si
/dev/stdin
se especifica en POSIX o no, pero veo que está presente tanto en Linux como en Mac OS X).Esto tiene una ventaja de legibilidad sobre el uso
sed
del espacio de espera: simplemente diceex
"mover estas líneas hasta el final" y lo hace. (El resto de los comandos significa "imprimir el búfer" y "salir", que también son bastante legibles).NB: El
ex
comando dado anteriormente fallará si se le dan menos de 2 líneas como entrada.Otras lecturas:
fuente
Un
python
fragmento corto :Pase el nombre del archivo como primer argumento y el número de líneas para moverse como segundo argumento.
Ejemplo:
fuente
Si puede almacenar toda la salida en la memoria:
fuente
Aquí hay otra opción que requiere GNU
sed
:-u
hace que GNU no tengased
búfer para que elsed
comando no consuma más de 3 líneas de STDIN. La sustitución del comando elimina las líneas vacías, de modo que el comando no incluye líneas vacías al final de la salida si las líneas tercera, tercera y segunda, o tercera, segunda y primera están vacías.También puedes hacer algo como esto:
Sin
sponge /dev/stdout|
el comando fallaría con entradas largas.sponge /dev/stdout
también se puede reemplazar contac|tac
, aunque eso se imprima, por ejemplo,a\ncb
si la entrada esa\nb\nc
donde\n
hay un salto de línea, o con(x=$(cat);printf %s\\n "$x")
, aunque eso elimine las líneas vacías del final de la entrada. El comando anterior elimina la primera línea cuando el número de líneas de la entrada es uno o dos.fuente