web-dev-qa-db-fra.com

Comment trier un fichier sur place

Lorsque nous utilisons la commande sort file, , Le fichier affiche son contenu de manière triée, que se passe-t-il si je ne souhaite obtenir aucun type de sortie mais un fichier trié?

137
Ali Sajid

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

sort input-file > output_file

Ou vous pouvez utiliser l'option de tri -o, --output=FILE pour indiquer le même fichier d'entrée et 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 sort (1) programme) et le fichier d’entrée (comme étant aussi la sortie) sera effacé juste avant de donner le sort (1) programmer l'opportunité de le lire.

284
Sylvain Bugat

La commande sort imprime le résultat de l'opération de tri sur la sortie standard par défaut. Pour réaliser un tri "sur place", vous pouvez le faire:

sort -o file file

Ceci remplace l'entrée file par la sortie triée. Le commutateur -o, utilisé pour spécifier une sortie, est défini par POSIX , doit donc être disponible sur toutes les versions de sort:

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

Si vous êtes assez malheureux pour avoir une version de sort sans le commutateur -o ( Luis m'assure qu'ils existent), vous pouvez obtenir une édition "sur place" de la manière standard:

sort file > tmp && mv tmp file
41
Tom Fenech

Pour trier le fichier en 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 d'abord évaluer la commande sort, puis la rediriger vers le fichier d'origine. De cette manière, vous pouvez implémenter le tri sur place.

De même, vous pouvez également appliquer cette astuce à une autre commande telle que paste pour implémenter l'ajout ligne par ligne.

2
Bo Tian
sort file | sponge file

Ceci est dans le paquet Fedora suivant:

moreutils : Additional unix utilities
Repo        : Fedora
Matched from:
Filename    : /usr/bin/sponge
1
SilverlightFox

Voici une approche qui (ab) utilise vim:

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

La partie -c :sort -c :wq appelle des commandes à vim après l'ouverture du fichier. -E et -s sont nécessaires pour que vim s'exécute dans un mode "sans tête" qui ne dessine pas vers le terminal.

Cela ne présente presque aucun avantage par rapport à l'approche sort -o "${filename}" "${filename}", si ce n'est qu'elle ne prend qu'une fois l'argument du nom de fichier.


Cela m'a été utile pour implémenter une directive formatter dans une entrée nanorc pour les fichiers .gitignore. Voici ce que j'ai utilisé pour ça:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
1
Anthony Sottile

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 {} \;
0
luandrea