Existe-t-il un moyen rapide d'enregistrer la sortie du tuyau dans le même fichier que celui traité. Par exemple, c'est ce que je fais réellement
$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename
Je me demandais s'il y avait un moyen de le faire en une seule ligne (sans ajouter ces commandes en utilisant &&)
Ce n'est pas comme ça, mais pour se faire une idée
$ cat filename | sort | uniq > filename
command-line
bash
whitenoisedb
la source
la source
echo $(cat filename | sort | uniq > result) > filename
ou quelque chose ? Juste en passant, je n'ai pas le temps de l'essayer.Réponses:
Vous pouvez utiliser à
sponge
partir du package moreutils :Vous n'avez également pas besoin de tuyau
uniq
, car quandsort
a l'-u
option de lignes uniques lors du tri.Notez que sur un système GNU avec des locales UTF-8,
sort -u
ousort | uniq
ne vous a pas donné de lignes uniques, mais la première d'une séquence de lignes qui les trient de la même manière dans les locales actuelles.vous a donné seulement
①
. Changer les paramètres régionaux en C force l'ordre de tri en fonction des valeurs d'octets:la source
Vous n'avez besoin d'aucune commande supplémentaire comme
cat
etuniq
et également sans utiliser larm
commande et lamv
commande pour supprimer et renommer le nom de fichier. utilisez simplement une commande simple.Comment ça marche?
sort
commande trie votre nom de fichier et avec-u
option, supprime les lignes en double. puis avec-o
option écrit la sortie dans le même fichier avec la méthode sur place.la source
sort
son exécution, vous perdrez votre fichier d'origine.L'exemple que vous avez suggéré (ci-dessous) ne fonctionne pas, car vous seriez en train de lire et d'écrire dans le même fichier simultanément.
L'idée avec un tuyau ou une redirection est que la commande à gauche et à droite de chaque tuyau ou redirection s'exécute simultanément, en parallèle. La commande de droite traite les informations telles qu'elles leur sont transmises par la commande de gauche, tandis que la commande de gauche est toujours en cours d'exécution.
Pour que votre scénario fonctionne, la commande qui lit à partir du fichier doit se terminer avant que la commande qui écrit dans le fichier ne commence. Pour que cela fonctionne, vous devez d'abord rediriger la sortie vers un emplacement temporaire, puis une fois terminé, renvoyez-la de l'emplacement temporaire dans le fichier.
Une meilleure façon de le faire est essentiellement comme dans votre exemple précédent, où vous redirigez vers un fichier temporaire, puis renommez ce fichier à l'original (sauf que vous n'avez pas besoin de supprimer le fichier d'abord, car le déplacement supprime toute cible existante) .
Vous pouvez également l'enregistrer dans une variable de chaîne, sauf que cela ne fonctionne que lorsque les données sont suffisamment petites pour toutes tenir en mémoire à la fois.
la source
cat filename | sort
à simplementsort filename
-cat
n'est pas nécessaire ici.cat
pourrait être inutile dans ce cas, mais je me concentrais sur la partie de redirection.Vous pouvez utiliser la
tee
commande:La
tee
commande lit à partir de l'entrée standard et écrit sur la sortie standard et les fichiers.la source
(cat ~/file | grep -v 3662 ; printentry 3662) | tee ~/file > /dev/null
fonctionne. Comme le message d'origine, cela ne fonctionne pas si vous venez> ~/file
sans letee
. Tee semble similaire à icisort -o file
, qui écrit dans le fichier nommé sans continuer le même canal.(cat x | grep -v 7 ; echo 7) | tee x > /dev/null; cat x
je recommande un fichier temporaire et /mv
ou peut-être la solution du lien de @ Steven.Vous pouvez utiliser Vim en mode Ex:
sort u
trier uniquex
écrire si des modifications ont été apportées (elles l'ont été) et quitterla source