Un a sortbesoin de voir toutes les entrées avant de pouvoir commencer à sortir. Pour cette raison, le sortprogramme peut facilement offrir une option pour modifier un fichier sur place:
sort temp.txt -o temp.txt
Plus précisément, la documentation de GNUsort dit:
Normalement, sort lit toutes les entrées avant d'ouvrir le fichier de sortie, de sorte que vous pouvez trier en toute sécurité un fichier sur place en utilisant des commandes comme sort -o F Fet cat F | sort -o F. Cependant, sortavec --merge( -m) peut ouvrir le fichier de sortie avant de lire toutes les entrées, donc une commande comme cat F | sort -m -o F - Gn'est pas sûre car le tri peut commencer à écrire Favant d'avoir catfini de le lire.
Alors que la documentation de BSD sortdit:
Si [le] fichier de sortie est l'un des fichiers d'entrée, tri le copie dans un fichier temporaire avant de trier et d'écrire la sortie dans [le] fichier de sortie.
Les commandes telles que uniqpeuvent commencer à écrire la sortie avant de terminer la lecture de l'entrée. Ces commandes ne prennent généralement pas en charge l'édition sur place (et il leur serait plus difficile de prendre en charge cette fonctionnalité).
Vous travaillez généralement autour de cela avec un fichier temporaire, ou si vous voulez absolument éviter d'avoir un fichier intermédiaire, vous pouvez utiliser un tampon pour stocker le résultat complet avant de l'écrire. Par exemple, avec perl:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Ici, la partie perl lit la sortie complète de uniqin variable $_puis écrase le fichier d'origine avec ces données. Vous pouvez faire de même dans le langage de script de votre choix, peut-être même dans Bash. Mais notez qu'il aura besoin de suffisamment de mémoire pour stocker le fichier entier, ce n'est pas conseillé lorsque vous travaillez avec des fichiers volumineux.