A sort
doit voir toutes les entrées avant de pouvoir commencer à sortir. Pour cette raison, le sort
peut facilement offrir une option permettant de modifier un fichier sur place :
sort temp.txt -o temp.txt
Plus précisément, le la documentation de GNU sort
dit :
Normalement, sort lit toutes les entrées avant d'ouvrir le fichier de sortie. Vous pouvez donc trier un fichier en place en toute sécurité en utilisant des commandes telles que sort -o F F
y cat F | sort -o F
. Cependant, sort
con --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ûr, car des personnes pourraient commencer à écrire F
avant cat
a fini de le lire.
Bien que la documentation de BSD sort
dit :
Si [le] fichier de sortie est l'un des fichiers d'entrée, sort le copie dans un fichier temporaire avant de trier et d'écrire la sortie dans [le] fichier de sortie.
Des commandes telles que uniq
peuvent commencer à écrire la sortie avant d'avoir fini de lire l'entrée. Ces commandes ne prennent généralement pas en charge l'édition in situ (et il serait plus difficile pour elles de prendre en charge cette fonctionnalité).
Vous pouvez généralement contourner ce problème 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
en variable $_
puis écrase le fichier d'origine avec ces données. Vous pourriez faire la même chose dans le langage de script de votre choix, peut-être même en Bash. Mais notez qu'il faudra suffisamment de mémoire pour stocker le fichier entier, ce qui n'est pas conseillé lorsque vous travaillez avec des fichiers volumineux.