A sort
necesita ver todas las entradas antes de que pueda comenzar a generar. Por esta razón, el sort
programa puede ofrecer fácilmente una opción para modificar un archivo en el lugar:
sort temp.txt -o temp.txt
Específicamente, la documentación de GNUsort
dice:
Normalmente, sort lee todas las entradas antes de abrir el archivo de salida, por lo que puede ordenar de forma segura un archivo en su lugar utilizando comandos como sort -o F F
y cat F | sort -o F
. Sin embargo, sort
con --merge
( -m
) puede abrir el archivo de salida antes de leer toda la entrada, por lo que un comando como cat F | sort -m -o F - G
no es seguro, ya que sort podría comenzar a escribir F
antes de cat
que termine de leerlo.
Mientras que la documentación de BSD sort
dice:
Si [el] archivo de salida es uno de los archivos de entrada, sort lo copia en un archivo temporal antes de ordenar y escribir la salida en [el] archivo de salida.
Los comandos como uniq
pueden comenzar a escribir la salida antes de que terminen de leer la entrada. Por lo general, estos comandos no admiten la edición en el lugar (y sería más difícil para ellos admitir esta función).
Por lo general, soluciona esto con un archivo temporal, o si absolutamente desea evitar tener un archivo intermedio, puede usar un búfer para almacenar el resultado completo antes de escribirlo. Por ejemplo, con perl
:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Aquí, la parte de perl lee la salida completa de una uniq
variable $_
y luego sobrescribe el archivo original con estos datos. Puede hacer lo mismo en el lenguaje de secuencias de comandos que elija, tal vez incluso en Bash. Pero tenga en cuenta que necesitará suficiente memoria para almacenar el archivo completo, esto no es recomendable cuando se trabaja con archivos grandes.