A ha sortbisogno di vedere tutti gli input prima di poter iniziare a produrre. Per questo motivo, il sortprogramma può facilmente offrire un'opzione per modificare un file sul posto:
sort temp.txt -o temp.txt
Nello specifico, la documentazione di GNUsort dice:
Normalmente, l'ordinamento legge tutto l'input prima di aprire il file di output, quindi puoi tranquillamente ordinare un file sul posto usando comandi come sort -o F Fe cat F | sort -o F. Tuttavia, sortcon --merge( -m) puoi aprire il file di output prima di leggere tutto l'input, quindi un comando come cat F | sort -m -o F - Gnon è sicuro in quanto l'ordinamento potrebbe iniziare a scrivere Fprimacat abbia finito di leggerlo.
Mentre la documentazione di BSD sortdice:
Se [il] file di output è uno dei file di input, sort lo copia in un file temporaneo prima di ordinare e scrivere l'output in [il] file di output.
Comandi come uniq possono iniziare a scrivere l'output prima che finiscano di leggere l'input. Questi comandi in genere non supportano la modifica sul posto (e sarebbe più difficile per loro supportare questa funzione).
In genere si aggira questo problema con un file temporaneo o, se si desidera assolutamente evitare di avere un file intermedio, è possibile utilizzare un buffer per memorizzare il risultato completo prima di scriverlo. Ad esempio, con perl:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Qui, la parte perl legge l'output completo dalla uniqvariabile in $_e quindi sovrascrive il file originale con questi dati. Potresti fare lo stesso nel linguaggio di scripting che preferisci, forse anche in Bash. Ma tieni presente che avrà bisogno di memoria sufficiente per archiviare l'intero file, questo non è consigliabile quando si lavora con file di grandi dimensioni.