Je sais que mon titre n'est pas très explicite, mais laissez-moi essayer de l'expliquer ici.
J'ai un nom de fichier test.txt strong> p> Je sais que je peux utiliser Alors, pourquoi la commande ci-dessus ne fonctionne pas et quelle est la bonne façon? P> Y a-t-il également un autre manière comme p> qui trie et met automatiquement à jour mon fichier sans qu'il soit nécessaire de redirection. p> p> test.txt code> qui a des lignes en double. Maintenant, ce que je veux faire, c'est supprimer ces lignes en double et en même temps
update test.txt code> avec le nouveau contenu. P>
trier -u test.txt code> pour supprimer les duplicats mais pour mettre à jour le fichier avec nouveau contenu comment puis-je rediriger c'est sortie dans le même fichier. La commande ci-dessous ne fonctionne pas. P>
5 Réponses :
Cela pourrait fonctionner pour vous:
sort -u -o test.txt test.txt
Merci pour la réponse, mais pourquoi je n'ai pas pu utiliser la redirection avec trier.
Ceci n'est pas aussi inefficace que celui-ci:
sort -u test.txt > test.txt.tmp && mv test.txt.tmp test.txt
Cela peut ne pas être insuffisant mais la réponse de @ Potong est beaucoup plus propre et plus simple.
C'est la réponse canonique à cette question. Coffre-fort, portable, simple et idiomatique.
La redirection dans la coquille ne fonctionnera pas comme vous essayez de lire et d'écrire dans le même fichier en même temps. En fait, le fichier est ouvert pour l'écriture ( @ Potong's Réponse fonctionne car le programme de tri lui-même stocke probablement toutes les lignes de mémoire, je ne vous en fallage pas, car il ne spécifie pas explicitement dans le manuel qu'il peut être identique au fichier d'entrée (bien qu'il fonctionne probablement ). Sauf que documentée ne fonctionne "en place", je ne le ferais pas (@ la réponse de Perreal fonctionnerait, ou vous pouvez stocker des résultats intermédiaires dans la mémoire Shell) P> > fichier.txt code>) avant que le tri soit même exécuté p>
Tout Sort code> ne peut donner que quelque chose du tout après Toutes les entrées i> à trier sont connues de l'algorithme - c'est vrai quel que soit l'algorithme utilisé. Cela signifie que la sortie de
trier code> ne sera donnée que lorsqu'il n'est plus nécessaire de lire à partir de
test.txt code>, donc je dirais que c'est par définition I> Safe à sortir au même fichier ...
@RODY_O, vous ne pouvez pas concevoir une sorte qui fonctionne sur le disque? Qu'ont-ils fait avant qu'il y ait «une mémoire infinie»? N'y a-t-il aucun moyen de trier sur le disque? Je ne suppose juste pas à savoir comment quelque chose est implémenté, s'il est documenté pour prendre en charge "en place" ou permet spécifiquement le même fichier, puis je lui fais confiance autrement, je préférerais faire preuve du bon côté de la sécurité.
Oui, viens y penser ... Tri des énormes fichiers doit être fait sur disque, mon mauvais. Je suis à moitié supposé que de petits fichiers seraient lus une fois i> et l'algorithme exécuté de la mémoire .... donc trier -o code> doit alors faire un peu plus de 2n écrit sur
test.txt code>, en supposant qu'il contient n lignes, correct?
@rody_o à partir d'une perspective de complexité O (n) == O (2n), donc 2n ne serait donc pas si mal, mais cela implique que vous ne pouvez pas utiliser le même dossier ... Cela dit, la discussion sur la complexité de tri est sortie Portée de cette discussion (et je suis rouillé, n'avez pas la question que depuis le collège), mais je suppose que sa façon pire ...
@nhed: de quoi tu parles s'appelle "tri externe"; Wikipedia a un Bon article sur celui-ci .
Vous pouvez utiliser l'utilitaire éponge em> de PLUS uTtils pour absorber la sortie standard avant d'écrire le fichier. Cela vous empêche d'avoir à mélanger des fichiers autour et se rapproche d'une modification en place. Par exemple: p> $ cat test.txt
AAAA
BBBB
CCCC
Vous pouvez utiliser Vim pour modifier le fichier de fichier: plusieurs fichiers: p>
duplicailler possible de Comment puis-je trier un fichier dans placer à l'aide d'une coque Bash?