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?
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.
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:
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.
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
file
ordenado 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).sort infile >outfile
y obtendrá la salida ordenada en el archivo "outfile". Luego puede borrar el "archivo" original y todo estará bien.Respuestas:
Puede usar la redirección de archivos para redirigir la salida ordenada:
O puede utilizar la
-o
,--output=FILE
opción de tipo para indicar el mismo archivo de entrada y de salida: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.fuente
GNU sort
pá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.sort -o file{,}
El
sort
comando 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:Esto sobrescribe la entrada
file
con la salida ordenada. El-o
interruptor, que se utiliza para especificar una salida, se define por POSIX , por lo que debería estar disponible en todas las versiones desort
:Si tiene la mala suerte de tener una versión
sort
sin el-o
interruptor ( Luis me asegura que existen), puede lograr una edición "in situ" de la manera estándar:fuente
Esto está en el siguiente paquete de Fedora:
fuente
sudo apt install moreutils
Para ordenar el archivo en su lugar, intente:
Como se explica en otras respuestas, no puede redirigir directamente la salida al archivo de entrada. Pero puedes evaluar el
sort
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
paste
implementar apéndices en fila.fuente
echo
puede meterse con escapes de barra invertida en POSIX y-o
funciona para el mismo archivo como entrada como se explica en: stackoverflow.com/a/29244387/895245Aquí hay un enfoque que (ab) usa
vim
:La
-c :sort -c :wq
parte invoca comandos para vim después de que se abre el archivo.-E
y-s
son 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
formatter
directiva en unananorc
entrada para.gitignore
archivos. Esto es lo que usé para eso:fuente
nanorc
? Oh, la ironía.¿Desea ordenar todos los archivos en una carpeta y subcarpeta anulándolos?
Utilizar este:
fuente