¿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) > filenameo algo ? De paso, no tengo tiempo para probarlo.Respuestas:
Se puede utilizar
spongedesde moreutils paquete:Tampoco necesita tubería
uniq, ya que cuandosorttiene la-uopción de líneas únicas al ordenar.Tenga en cuenta que en el sistema GNU con configuraciones regionales UTF-8,
sort -uosort | uniqno 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
catyuniqtambién sin necesidad de utilizarrmel mando ymvcomando para quitar y cambiar el nombre del nombre de archivo. solo usa un comando simple.¿Como funciona?
sortEl comando ordena su nombre de archivo y, con la-uopción, elimina las líneas duplicadas. luego con la-oopción escribe la salida en el mismo archivo con el método in situ.fuente
sortestá 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 | sorta solosort filename:cates innecesario aquí.catpodría ser innecesario en este caso, pero me estaba centrando en la parte de redirección.Puedes usar el
teecomando:El
teecomando 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/nullfunciona. Al igual que el post original, esto no funciona si sólo> ~/filesin 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 xrecomiendo un archivo temporal y /mvo tal vez la solución del enlace de @ Steven.Puede usar Vim en modo Ex:
sort utipo únicoxescriba si se han realizado cambios (lo han hecho) y salgafuente