Comment trier un fichier sur place

206

Lorsque nous utilisons la sort filecommande, le fichier affiche son contenu de manière triée, que se passe-t-il si je ne veux pas obtenir un type de sortie mais un fichier trié?

Ali Sajid
la source
Veuillez mettre à jour votre question pour expliquer clairement ce que vous voulez faire avec le résultat du tri du fichier. Voulez-vous le trier sur place, en remplaçant le contenu non trié de filepar le contenu trié du même fichier? La façon dont votre question est actuellement formulée, ne rien faire du tout est une bonne réponse (vous ne voulez aucune sortie, donc ne faites rien).
Keith Thompson
@ KeithThompson merci pour votre inquiétude, j'essayais de trier un fichier mais je voulais éviter la sortie à l'écran.
Ali Sajid
Alors, où voulez-vous que la sortie aille? Dans un nouveau fichier? Dans le fichier d'origine? À l'imprimante au bout du couloir?
Keith Thompson
1
Dans le dossier d'origine
Ali Sajid
exécutez sort infile >outfileet vous obtiendrez la sortie triée dans le fichier "outfile". Ensuite, vous pouvez effacer le "fichier" d'origine et tout ira bien.
Luis Colorado

Réponses:

410

Vous pouvez utiliser la redirection de fichiers pour rediriger la sortie triée:

sort input-file > output_file

Ou vous pouvez utiliser la -o, --output=FILEpossibilité de tri pour indiquer la même entrée et le fichier de sortie:

sort -o file file

Remarque: Une erreur courante consiste à essayer de rediriger la sortie vers le même fichier d'entrée (par exemple sort file > file). Cela ne fonctionne pas car le shell effectue les redirections (pas le programme sort (1) ) et le fichier d'entrée (comme étant également la sortie) sera effacé juste avant de donner au programme sort (1) la possibilité de le lire.

Sylvain Bugat
la source
89
Bonne note sur l'erreur courante
Drakes
1
Cela est vraiment utile lorsque vous devez modifier manuellement les dictionnaires pour LaTeX, +1
Bryson S.
6
Juste pour mentionner l'importance de l'ordre. Depuis la GNU sortpage d'informations: -o OUTPUT-FILE' --output = OUTPUT-FILE 'Ecrit la sortie dans OUTPUT-FILE au lieu de la sortie standard. Sur les systèmes plus récents, -o' cannot appear after an input file if POSIXLY_CORRECT 'est défini, par exemple, sort F -o F'. Portable scripts should specify -o OUTPUT-FILE' avant tout fichier d'entrée.
Yassine ElBadaoui
14
Pour éviter de répéter le nom du fichier:sort -o file{,}
tstenner
65

La sortcommande imprime le résultat du tri sur la sortie standard par défaut. Pour obtenir un tri "sur place", vous pouvez procéder comme suit:

sort -o file file

Cela écrase l'entrée fileavec la sortie triée. Le -ocommutateur, utilisé pour spécifier une sortie, est défini par POSIX , il doit donc être disponible sur toutes les versions de sort:

-o Spécifiez le nom d'un fichier de sortie à utiliser à la place de la sortie standard. Ce fichier peut être identique à l'un des fichiers d'entrée.

Si vous avez la malchance d'avoir une version de sortsans le -ocommutateur ( Luis m'assure qu'ils existent), vous pouvez réaliser un montage "sur place" de la manière standard:

sort file > tmp && mv tmp file
Tom Fenech
la source
2
+ ^ pour la meilleure réponse, et avec une question ambiguë aussi, mais toujours en haut de la page, il faut donc la booster.
u2n
6
sort file | sponge file

C'est dans le package Fedora suivant:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge
SilverlightFox
la source
1
Cela fonctionne également sur Ubuntu après l'installation avecsudo apt install moreutils
Serge Stroobandt
4

Pour trier le fichier sur place, essayez:

echo "$(sort your_file)" > your_file

Comme expliqué dans d'autres réponses, vous ne pouvez pas rediriger directement la sortie vers le fichier d'entrée. Mais vous pouvez évaluersort commande, puis la rediriger vers le fichier d'origine. De cette façon, vous pouvez implémenter le tri sur place.

De même, vous pouvez également appliquer cette astuce à d'autres commandes, comme l' pasteimplémentation de l'ajout par ligne.

Bo Tian
la source
1
C'est mauvais car cela ne fonctionnera pas pour les fichiers volumineux, les bandes qui terminent les sauts de ligne, echopeuvent jouer avec les échappements antislash dans POSIX, et -ofonctionne pour le même fichier en entrée comme expliqué sur: stackoverflow.com/a/29244387/895245
Ciro Santilli 郝海东冠状 病 六四 事件 法轮功
4

Voici une approche qui (ab) utilise vim:

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

La -c :sort -c :wqpartie appelle des commandes à vim après l'ouverture du fichier. -Eet -ssont nécessaires pour que vim s'exécute dans un mode "sans tête" qui n'attire pas le terminal.

Cela n'a presque aucun avantage sur l' sort -o "${filename}" "${filename}"approche, sauf qu'il ne prend l'argument de nom de fichier qu'une seule fois.


Cela m'a été utile pour implémenter une formatterdirective dans une nanorcentrée pour les .gitignorefichiers. Voici ce que j'ai utilisé pour cela:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
Anthony Sottile
la source
4
Vous utilisez vim dans votre nanorc? Oh l'ironie.
Brett Holman
2

Voulez-vous trier tous les fichiers d'un dossier et d'un sous-dossier en les remplaçant?

Utilisez ceci:

find . -type f -exec sort {} -o {} \;
Luandrea
la source