Déplacer les lignes correspondant à un motif à partir d'un fichier à l'autre
Je veux déplacer les lignes correspondant à certain modèle de fichier1 à fichier2. Analogue à l'opération couper et coller à partir d'un fichier à un autre dans windows
Exemple
disons que je veux couper toutes les lignes contenant bar
de fichier1 et le coller dans nouvellement créé fichier2
D'entrée:
fichier1
bla foo bla
bla bar bla
bla aaa bla
bla bar bla
bla foo bla
De sortie désiré après le traitement:
fichier1
bla foo bla
bla aaa bla
bla foo bla
fichier2
bla bar bla
bla bar bla
Ce que j'ai essayé
grep
crée souhaité fichier2 mais ne modifie pas la fichier1
grep 'bar' file1 > file2
sed -i
modifie souhaité fichier1 mais ne crée pas de fichier2
sed -i '/bar/d' file1
Si je exécuter les deux commandes l'une après l'autre, j'obtiens le résultat souhaité. Mais ici, je suis à la recherche d'un seule ligne de commande de la curiosité et de faire un script plus concis.
Votre aide serait appréciée.
-1
? Pas de commentaire? Celui qui ne qui devrait montrer comment résoudre ce problème en ligne de commande avant d'en bas à droit de vote!Vote pour fermer sans donner de raison ou un commentaire?! C'est trop.
OriginalL'auteur jkshah | 2013-10-19
Vous devez vous connecter pour publier un commentaire.
Cela pourrait fonctionner pour vous (GNU sed):
Une alternative:
À ajouter à fichier2, écrire dans un fichier temporaire et l'utilisation de chat à ajouter en fin de fichier dans un script bash, ou de l'utilisation:
N. B. Pour la dernière solution, un seul fichier d'entrée peut être modifié à la fois.
w
etd
avec{}
. Merci beaucoup..Seule chose que cela ne peut pas faire est d'ajouter des lignes à fichier2, il insiste sur l'écrasement.
OriginalL'auteur potong
Vous pouvez utiliser perl et sélectionner un autre descripteur de fichier basé dans un match d'une expression régulière lors de l'impression:
Il rendements:
Can't rename file1 to file1.bak: Text file busy, skipping file.
je pense que c'est en essayant de modifierfile1
en cours de traitement. Je me demande comment il a travaillé pour vous et ce qui ne va pas sur mon système!Quel système d'exploitation utilisez-vous. J'ai vu ce message d'erreur s'exécutant sous Linux, mais lorsque le fichier est sur un virtual box système de fichiers partagé.
C'est très vrai. J'ai essayé avec Ubuntu sur virtual box! Maintenant essayé sur un système autonome et cela a fonctionné! Merci beaucoup.
OriginalL'auteur Birei
Ce
awk
script fera l'affaire:Sorties:
awk '{print $0 > ($0~/bar/?"file2":"file1")}' file1
. Merci beaucoup!Pas sûr de savoir pourquoi vous avez créé
a[i]
. simple$0
a fonctionné pour moi. Ai-je raté quelque chose?OriginalL'auteur Chris Seymour
Vous pouvez mettre un
&&
entre les deux commandes pour en faire une seule ligne. Mais ce ne sera plus lisible, donc je ne vous recommande pas de le faire.À faire la même chose en une seule commande, vous avez besoin de quelque chose qui peut modifier un fichier en place, en supprimant les lignes que vous ne voulez pas, et en même temps l'impression de ces lignes
stdout
oustderr
de sorte que vous pourrait rediriger vers un autre fichier.Peut-être
ed
peut le faire, mais je ne sais pas comment écrire ça.Je ne pense pas qu'il y est un autre "standard" UNIX outil pour ce faire.
Btw, cut & coller a en fait en 3 étapes:
Le 2-l'étape de commande UNIX il le fait sans presse-papiers.
OriginalL'auteur janos
J'aime sur les autres réponses, mais juste un (évident) approche alternative dans le cas où vous êtes inquiet au sujet de faire une erreur dans votre profil et que vous cherchez un moyen facile d'annulation:
Une fois que vous êtes satisfait de vos résultats (indice:
tee
au lieu de>
vous permettra de voir ce qui s'écrit de vos fichiers):Généralement je préfère perl pour faire de la substitution comme dans la réponse ci-dessus, mais quand la regex idiome est trop compliqué et que vous êtes en semi-aveugle de copier et de coller des commandes vous ne comprenez pas, vous n'êtes pas dans le contrôle de vos précieuses données.
OriginalL'auteur Sridhar-Sarnobat