¿Hay alguna forma corta de guardar la salida de la tubería en el mismo archivo que se procesa? Por ejemplo, esto es lo que realmente estoy haciendo.
$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename
Me preguntaba si había una manera de hacerlo en una sola línea (sin agregar esos comandos usando &&)
Este no es el camino, pero para tener una idea
$ cat filename | sort | uniq > filename
command-line
bash
blanqueadob
fuente
fuente
echo $(cat filename | sort | uniq > result) > filename
o algo ? De paso, no tengo tiempo para probarlo.Respuestas:
Se puede utilizar
sponge
desde moreutils paquete:Tampoco necesita tubería
uniq
, ya que cuandosort
tiene la-u
opción de líneas únicas al ordenar.Tenga en cuenta que en el sistema GNU con configuraciones regionales UTF-8,
sort -u
osort | uniq
no le dio líneas únicas, sino la primera de la secuencia de líneas que clasifican lo mismo en la configuración regional actual.que dio solamente
①
. Cambiar la configuración regional a C fuerza el orden de clasificación en función de los valores de bytes:fuente
No es necesario ningún comando extra, como
cat
yuniq
también sin necesidad de utilizarrm
el mando ymv
comando para quitar y cambiar el nombre del nombre de archivo. solo usa un comando simple.¿Como funciona?
sort
El comando ordena su nombre de archivo y, con la-u
opción, elimina las líneas duplicadas. luego con la-o
opción escribe la salida en el mismo archivo con el método in situ.fuente
sort
está ejecutando, perderá su archivo original.Su ejemplo sugerido (a continuación) no funciona porque en realidad estaría leyendo y escribiendo en el mismo archivo simultáneamente.
La idea con una tubería o redirección es que el comando en el lado izquierdo y derecho de cada tubería o redirección se ejecute simultáneamente, en paralelo. El comando de la derecha procesa la información a medida que se le entrega desde el comando de la izquierda, mientras que el comando de la izquierda todavía se está ejecutando.
Para que su escenario funcione, el comando que lee del archivo debería finalizar antes de que comience el comando que escribe en el archivo. Para que esto funcione, primero debe redirigir la salida a una ubicación temporal, luego, una vez que haya terminado, envíela desde la ubicación temporal nuevamente al archivo.
Una mejor manera de hacer esto es básicamente como en su ejemplo anterior, donde redirige a un archivo temporal y luego cambia el nombre del archivo al original (excepto que no necesita eliminar el archivo primero, porque al moverlo se elimina cualquier objetivo existente) .
También puede guardarlo en una variable de cadena, excepto que solo funciona cuando los datos son lo suficientemente pequeños como para que quepan todos en la memoria a la vez.
fuente
cat filename | sort
a solosort filename
:cat
es innecesario aquí.cat
podría ser innecesario en este caso, pero me estaba centrando en la parte de redirección.Puedes usar el
tee
comando:El
tee
comando lee de la entrada estándar y escribe en la salida y los archivos estándar .fuente
(cat ~/file | grep -v 3662 ; printentry 3662) | tee ~/file > /dev/null
funciona. Al igual que el post original, esto no funciona si sólo> ~/file
sin eltee
. Tee parece similar aquísort -o file
, que escribe en el archivo nombrado sin continuar la misma tubería.(cat x | grep -v 7 ; echo 7) | tee x > /dev/null; cat x
recomiendo un archivo temporal y /mv
o tal vez la solución del enlace de @ Steven.Puede usar Vim en modo Ex:
sort u
tipo únicox
escriba si se han realizado cambios (lo han hecho) y salgafuente