10
votes

Comment supprimer des doublons d'un fichier et écrire dans le même fichier?

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 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 avec le nouveau contenu.

test.txt xxx

Je sais que je peux utiliser trier -u test.txt 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. xxx

Alors, pourquoi la commande ci-dessus ne fonctionne pas et quelle est la bonne façon?

Y a-t-il également un autre manière comme xxx

qui trie et met automatiquement à jour mon fichier sans qu'il soit nécessaire de redirection.


5 Réponses :


12
votes

Cela pourrait fonctionner pour vous:

sort -u -o test.txt test.txt


1 commentaires

Merci pour la réponse, mais pourquoi je n'ai pas pu utiliser la redirection avec trier.



2
votes

Ceci n'est pas aussi inefficace que celui-ci:

sort -u test.txt > test.txt.tmp && mv test.txt.tmp test.txt 


2 commentaires

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.



5
votes

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 (> fichier.txt ) avant que le tri soit même exécuté

@ 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)


5 commentaires

Tout Sort ne peut donner que quelque chose du tout après Toutes les entrées à trier sont connues de l'algorithme - c'est vrai quel que soit l'algorithme utilisé. Cela signifie que la sortie de trier ne sera donnée que lorsqu'il n'est plus nécessaire de lire à partir de test.txt , donc je dirais que c'est par définition 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 et l'algorithme exécuté de la mémoire .... donc trier -o doit alors faire un peu plus de 2n écrit sur test.txt , 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 .



4
votes

Utilisez l'éponge pour la lecture / l'écriture au même fichier

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


0 commentaires

0
votes

Vous pouvez utiliser Vim pour modifier le fichier de fichier: xxx

plusieurs fichiers: xxx


0 commentaires