Salut à tous,
Voila, je souhaiterais tout simplement remplacer une chaine de caractères d'un champs précis dans un fichier qui ressemble a ca:
aa1231231231aaa bbbb8888bb ccccccccccc
ddddd eeeeeeeee5957595759eeeeeeeeeee
aaaaaaaaaaaaaaa bbbbb5555 bbbb63411bb
ddddd ggggggggggg89898989ggggggggggg
En gros, comment je peux remplacer la chaine de caractère "5759e" du 4eme champs par la chaine de caractère "1111b" et la chaine de caractère "g8989" par "k5432" ?
Merci d'avance
# oups
Posté par ArLouarn Mog . Évalué à 1.
Mais vous l'avez noté je pense :)
[^] # Re: oups
Posté par Cheneson Cyril . Évalué à 1.
Donne plus d infos sur comment sont composes/definies tes champs parce que la, je ne voies pas quelle groupe de caracteres appartient a quel champ
[^] # Re: oups
Posté par nats . Évalué à 1.
Mais tu as un langage particulier en tête ?
Parce que pour travailler sur les chaines y a quand meme pas mal de differences... (au niveau fonctions et methodes disponibles)
[^] # Re: oups
Posté par ArLouarn Mog . Évalué à 1.
Le truc c'est que lorsqu'on me demande cela, c'est aléatoire, en gros, on peut me dire de modifier le champ 4 ou le champ 64 etc.
Ce que je souhaite c'est un script ou une commande (j'ai essayé avec sed mais ca n'a pas donné le résultat escompté) qui puisse me permettre de simplement modifier une chaine de caractère dans le champs 5753 par exemple. Parceque remplacer 5555 par 6666 dans le 5eme champs ca se fait facilement à la main mais trouver le champ 48521, c'est un peu plus chaud.
Sous sed, j'avais essayé un truc du style :
sed "2s/6706/7777/" fichier.old> fichier.new mais bof donc ....
Merci
# Avec sed ?
Posté par omnikron . Évalué à 2.
$ cat fichier_source | sed -e 's/5759e/1111b/' > nouveau_fichier
Cela remplace globalement tous les "5759e" par des "1111b". Ça fonctionne donc dans l'hypothèse où tu souhaite remplacer toutes les occurrences.
Tu peux répéter la commande, ou re-piper pour faire un second remplacement.
$ cat fichier_source | sed -e 's/5759e/1111b/' | sed ... > nouveau_fichier
Ou donner plusieurs instructions à sed.
$ cat fichier_source | sed -e 's/5759e/1111b/; s/g8989/k5432/' > nouveau_fichier
[^] # Re: Avec sed ?
Posté par omnikron . Évalué à 1.
[^] # Re: Avec sed ?
Posté par ArLouarn Mog . Évalué à 1.
Il y a une petite chose qui est importante, c'est le "numéro" du champ.
Je ne peux pas remplacer par exemple la chaîne 6545 du champs 57733 parceque je ne dois modifier que la chaine de caractère 6545 du champs 5. J'avais peut être mal précisé mais la chaine 6545 peut quand même se retouver ailleurs dans mon fichier. Comme une date par exemple.
Suis je clair ?
[^] # Re: Avec sed ?
Posté par ArLouarn Mog . Évalué à 1.
grep 060620401 fichier.old | sed -e '200s/060620401/777777777/' > fichier.new change bien le premier champ à la 200eme ligne, mais je ne sais pas comment changer le 4eme champ par exemple de cette 200eme ligne ...
[^] # Re: Avec sed ?
Posté par ArLouarn Mog . Évalué à 1.
#awk '{print $3}' | sed -e '680s/5555/7777/' fichier.old > fichier.new
Cela me permet donc de changer la chaine de caractère 5555 par 7777 sur le 3eme champs de la ligne 680 ....
[^] # Re: Avec sed ?
Posté par Thomas Douillard . Évalué à 1.
[^] # Re: Avec sed ?
Posté par Thomas Douillard . Évalué à 2.
le sed, faut virer l'option -e fichier.old sinon il prends pas sur l'entrée standard.
donc en résumé : cat fichier.old | awk '{print $3}' | sed -e '680s/5555/7777/' > fichier.new
Mais la tu vas perdre toutes les autres colonnes, ce qui est pas top.
peut être qu'un truc du genre :
cat fichier.new | awk ' $3=tachaine { print $1 $2 remplacement $* ;}
$3 != tachaine { print laligne } ;
'
marcherait, mais c'est avec mes souvenir de awk, $* existe sans doute pas, laligne c'est un caractère à rechercher dans le man.
[^] # Re: Avec sed ?
Posté par 태 (site web personnel) . Évalué à 2.
$3~/tachaine/ {sub(/tachaine/,"remplacement",$3)}
1 {print $0}
En fait, si tu fais dans le cas où $3 est machin, changer machin puis ecrire, dans le cas ou $3 n'est pas machin, ecrire, il va ecrire les deux : il fait les tests sequentiellement... C'est pour ça que je n'ai mis qu'un print $0. Le fait de faire le remplacement directement dans $3 modifie effectivement la ligne comme on veut.
# sed & awk
Posté par dguihal . Évalué à 2.
Non testé mais ça ne devrait être pas trop loin de la vérité
[^] # Re: sed & awk
Posté par ArLouarn Mog . Évalué à 1.
{
if ( NR == 2 )
{
sub("bbb","xxx",$5) ;
}
print
}
ca marche aussi sauf ... que mes espaces sont réduits entre mes champs et positionnés à 1 espace ....
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.