Come ordinare un file sul posto


205

Quando usiamo il sort filecomando, il file mostra i suoi contenuti in modo ordinato e se non volessi ottenere alcun tipo di output ma un file ordinato?


Aggiorna la tua domanda per indicare chiaramente cosa vuoi fare con il risultato dell'ordinamento del file. Vuoi ordinarlo sul posto, sostituendo i contenuti non fileordinati con i contenuti ordinati dello stesso file? Il modo in cui la tua domanda è attualmente dichiarata, non fare nulla è una risposta corretta (non vuoi alcun risultato, quindi non fare nulla).
Keith Thompson,

@KeithThompson grazie davvero per la tua preoccupazione, stavo cercando di ordinare un file ma volevo evitare l'output sullo schermo.
Ali Sajid,

Quindi dove vuoi che vada l'output? In un nuovo file? Nel file originale? Alla stampante in fondo al corridoio?
Keith Thompson,

1
Nel file originale
Ali Sajid,

esegui sort infile >outfilee otterrai l'output ordinato nel file "outfile". Quindi puoi cancellare l'originale "infile" e tutto andrà bene.
Luis Colorado,

Risposte:


409

È possibile utilizzare il reindirizzamento dei file per reindirizzare l'output ordinato:

sort input-file > output_file

Oppure è possibile utilizzare la -o, --output=FILEpossibilità di sorta per indicare lo stesso file di input e di output:

sort -o file file

Nota: un errore comune è provare a reindirizzare l'output sullo stesso file di input (ad es sort file > file.). Questo non funziona poiché la shell sta effettuando i reindirizzamenti (non il programma sort (1) ) e il file di input (come anche l'output) verrà cancellato poco prima di dare al programma sort (1) l'opportunità di leggerlo.


88
Buona nota
sull'errore

1
Questo è davvero utile quando è necessario modificare manualmente i dizionari per LaTeX, +1
Bryson S.

6
Solo per citare l'importanza dell'ordine. Dalla GNU sortpagina -o OUTPUT-FILE' informativa : --output = OUTPUT-FILE 'Scrive l'output su OUTPUT-FILE invece dell'output standard. Sui sistemi più recenti, -o' cannot appear after an input file if POSIXLY_CORRECT 'è impostato, ad es. sort F -o F'. Portable scripts should specify -O OUTPUT-FILE' prima di qualsiasi file di input.
Yassine ElBadaoui,

14
Per evitare di ripetere il nome del file:sort -o file{,}
tstenner,

65

Il sortcomando stampa il risultato dell'operazione di ordinamento sull'output standard per impostazione predefinita. Per ottenere un ordinamento "sul posto", è possibile effettuare ciò:

sort -o file file

Ciò sovrascrive l'input filecon l'output ordinato. Lo -oswitch, utilizzato per specificare un output, è definito da POSIX , quindi dovrebbe essere disponibile su tutte le versioni di sort:

-o Specifica il nome di un file di output da utilizzare al posto dello standard output. Questo file può essere uguale a uno dei file di input.

Se sei abbastanza sfortunato da avere una versione sortsenza lo -oswitch ( Luis mi assicura che esistono), puoi ottenere una modifica "sul posto" in modo standard:

sort file > tmp && mv tmp file

2
+ ^ per la migliore risposta, e anche con una domanda ambigua, ma ancora al top della pagina, quindi ha bisogno di essere potenziato.
u2n

6
sort file | sponge file

Questo è nel seguente pacchetto Fedora:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge

1
Questo funziona anche su Ubuntu dopo l'installazione consudo apt install moreutils
Serge Stroobandt,

4

Per ordinare il file sul posto, prova:

echo "$(sort your_file)" > your_file

Come spiegato in altre risposte, non è possibile reindirizzare direttamente l'output al file di input. Ma puoi valutare ilsort comando e poi reindirizzarlo nuovamente al file originale. In questo modo è possibile implementare l'ordinamento sul posto.

Allo stesso modo, puoi anche applicare questo trucco ad altri comandi come pasteimplementare l'aggiunta di righe.


1
Questo è un male perché non lavoro per file di grandi dimensioni, a capo strisce terminano, echopuò rovinare con fughe backslash POSIX, e -ofunziona per lo stesso file come input come spiegato a: stackoverflow.com/a/29244387/895245
Ciro Santilli郝海东法轮功 病 六四 事件 法轮功

4

Ecco un approccio che (ab) usa vim :

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

Il -c :sort -c :wq parte richiama i comandi per vim dopo l'apertura del file. -Ee -ssono necessari in modo che vim venga eseguito in una modalità "senza testa" che non attiri il terminale.

Questo non ha quasi alcun vantaggio rispetto al sort -o "${filename}" "${filename}" sull'approccio, tranne fatto che accetta l'argomento nome file una sola volta.


Questo mi è stato utile per implementare una formatterdirettiva in una nanorcvoce per i .gitignorefile. Ecco cosa ho usato per quello:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s

4
Stai usando VIM nel tuo nanorc? Oh l'ironia.
Brett Holman,

2

Vuoi ordinare tutti i file in una cartella e sottocartella sovrascrivendoli?

Usa questo:

find . -type f -exec sort {} -o {} \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.