Cómo ordenar un archivo en el lugar

205

Cuando usamos el sort filecomando, el archivo muestra su contenido de forma ordenada, ¿qué pasa si no quiero obtener ningún tipo de salida sino un archivo ordenado?

Ali Sajid
fuente
Actualice su pregunta para explicar claramente qué desea hacer con el resultado de ordenar el archivo. ¿Desea ordenarlo en su lugar, reemplazando el contenido no fileordenado por el contenido ordenado del mismo archivo? La forma en que se formula su pregunta actualmente, no hacer nada es una respuesta correcta (no desea ningún resultado, así que no haga nada).
Keith Thompson
@KeithThompson gracias por su preocupación en realidad, estaba tratando de ordenar un archivo pero quiero evitar la salida en la pantalla.
Ali Sajid
Entonces, ¿dónde quieres que vaya la salida? ¿En un nuevo archivo? ¿En el archivo original? ¿A la impresora del pasillo?
Keith Thompson
1
En el archivo original
Ali Sajid
ejecutar sort infile >outfiley obtendrá la salida ordenada en el archivo "outfile". Luego puede borrar el "archivo" original y todo estará bien.
Luis Colorado

Respuestas:

409

Puede usar la redirección de archivos para redirigir la salida ordenada:

sort input-file > output_file

O puede utilizar la -o, --output=FILEopción de tipo para indicar el mismo archivo de entrada y de salida:

sort -o file file

Nota: Un error común es intentar redirigir la salida al mismo archivo de entrada (p sort file > file. Ej .). Esto no funciona ya que el shell está haciendo las redirecciones (no el programa sort (1) ) y el archivo de entrada (como también la salida) se borrará justo antes de darle al programa sort (1) la oportunidad de leerlo.

Sylvain Bugat
fuente
88
Buena nota sobre el error común
Drakes
1
Esto realmente es útil cuando necesita editar manualmente diccionarios para LaTeX, +1
Bryson S.
66
Solo por mencionar la importancia del orden. Desde la GNU sortpágina de información: -o OUTPUT-FILE' --output = OUTPUT-FILE 'Escribe la salida en OUTPUT-FILE en lugar de la salida estándar. En los sistemas más nuevos, -o' cannot appear after an input file if POSIXLY_CORRECT 'se establece, por ejemplo, sort F -o F'. Portable scripts should specify -o OUTPUT-FILE' antes de cualquier archivo de entrada.
Yassine ElBadaoui
14
Para evitar repetir el nombre de archivo:sort -o file{,}
tstenner
65

El sortcomando imprime el resultado de la operación de clasificación a la salida estándar de forma predeterminada. Para lograr una ordenación "in situ", puede hacer esto:

sort -o file file

Esto sobrescribe la entrada filecon la salida ordenada. El -ointerruptor, que se utiliza para especificar una salida, se define por POSIX , por lo que debería estar disponible en todas las versiones de sort:

-o Especifique el nombre de un archivo de salida que se utilizará en lugar de la salida estándar. Este archivo puede ser el mismo que uno de los archivos de entrada.

Si tiene la mala suerte de tener una versión sortsin el -ointerruptor ( Luis me asegura que existen), puede lograr una edición "in situ" de la manera estándar:

sort file > tmp && mv tmp file
Tom Fenech
fuente
2
+ ^ para obtener la mejor respuesta, y con preguntas ambiguas también, pero aún en el rango de la página superior, por lo que necesita aumentar.
U2n
6
sort file | sponge file

Esto está en el siguiente paquete de Fedora:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge
SilverlightFox
fuente
1
Esto también funciona en Ubuntu después de instalar consudo apt install moreutils
Serge Stroobandt
4

Para ordenar el archivo en su lugar, intente:

echo "$(sort your_file)" > your_file

Como se explica en otras respuestas, no puede redirigir directamente la salida al archivo de entrada. Pero puedes evaluar elsort primero comando y luego redirigirlo al archivo original. De esta manera, puede implementar la ordenación in situ.

Del mismo modo, también puede aplicar este truco a otro comando como pasteimplementar apéndices en fila.

Bo Tian
fuente
1
Esto es malo porque no funcionará para archivos grandes, las tiras que terminan con las nuevas líneas, echopuede meterse con escapes de barra invertida en POSIX y -ofunciona para el mismo archivo como entrada como se explica en: stackoverflow.com/a/29244387/895245
Ciro Santilli 郝海东冠状 病 六四 事件 法轮功
4

Aquí hay un enfoque que (ab) usa vim:

vim -c :sort -c :wq -E -s "${filename}"

La -c :sort -c :wqparte invoca comandos para vim después de que se abre el archivo. -Ey -sson necesarios para que vim se ejecute en un modo "sin cabeza" que no atrae al terminal.

Esto casi no tiene beneficios sobre el sort -o "${filename}" "${filename}"enfoque, excepto que solo toma el argumento del nombre de archivo una vez.


Esto fue útil para mí para implementar una formatterdirectiva en una nanorcentrada para .gitignorearchivos. Esto es lo que usé para eso:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
Anthony Sottile
fuente
44
¿Estás usando vim en tu nanorc? Oh, la ironía.
Brett Holman
2

¿Desea ordenar todos los archivos en una carpeta y subcarpeta anulándolos?

Utilizar este:

find . -type f -exec sort {} -o {} \;
luandrea
fuente