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é?
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.
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:
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.
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
file
par 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).sort infile >outfile
et vous obtiendrez la sortie triée dans le fichier "outfile". Ensuite, vous pouvez effacer le "fichier" d'origine et tout ira bien.Réponses:
Vous pouvez utiliser la redirection de fichiers pour rediriger la sortie triée:
Ou vous pouvez utiliser la
-o
,--output=FILE
possibilité de tri pour indiquer la même entrée et le fichier de sortie: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.la source
GNU sort
page 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.sort -o file{,}
La
sort
commande 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:Cela écrase l'entrée
file
avec la sortie triée. Le-o
commutateur, utilisé pour spécifier une sortie, est défini par POSIX , il doit donc être disponible sur toutes les versions desort
:Si vous avez la malchance d'avoir une version de
sort
sans le-o
commutateur ( Luis m'assure qu'ils existent), vous pouvez réaliser un montage "sur place" de la manière standard:la source
C'est dans le package Fedora suivant:
la source
sudo apt install moreutils
Pour trier le fichier sur place, essayez:
Comme expliqué dans d'autres réponses, vous ne pouvez pas rediriger directement la sortie vers le fichier d'entrée. Mais vous pouvez évaluer
sort
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'
paste
implémentation de l'ajout par ligne.la source
echo
peuvent jouer avec les échappements antislash dans POSIX, et-o
fonctionne pour le même fichier en entrée comme expliqué sur: stackoverflow.com/a/29244387/895245Voici une approche qui (ab) utilise
vim
:La
-c :sort -c :wq
partie 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 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
formatter
directive dans unenanorc
entrée pour les.gitignore
fichiers. Voici ce que j'ai utilisé pour cela:la source
nanorc
? Oh l'ironie.Voulez-vous trier tous les fichiers d'un dossier et d'un sous-dossier en les remplaçant?
Utilisez ceci:
la source