Un a sort
besoin de voir toutes les entrées avant de pouvoir commencer à sortir. Pour cette raison, le sort
programme 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 F
et cat F | sort -o F
. Cependant, sort
avec --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 - G
n'est pas sûre car le tri peut commencer à écrire F
avant d'avoir cat
fini de le lire.
Alors que la documentation de BSD sort
dit:
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 uniq
peuvent 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 uniq
in 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.