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é?
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.
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
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.
sort file | sponge file
Ceci est dans le paquet Fedora suivant:
moreutils : Additional unix utilities
Repo : Fedora
Matched from:
Filename : /usr/bin/sponge
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
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 {} \;