Specifier numéro du champ, command sed ou awk
Résolu
teab
-
teab -
teab -
Bonjour à tous,
Une petite question concernant la commande sed.
Voila mon problème. J'ai un fichier texte (toto.txt) qui contient 3 colonnes de nombres. Je dois remplacer à la ligne N (=15 par ex) le champ 3 par une chaine que je noterai newstr. Le champ 3 est une chaine que j'appelle oldstr.
fichier: str1 str2 oldstring
Jusqu'à présent, je faisais:
sed -i '15 s/oldstr/newstr/' toto.txt
resultat --> str1 str2 newstring
donc cela marche très bien sauf si le champ 2 a la même valeur que le champ 3:
fichier: str1 oldstr oldstr
Car dans ce cas il me remplace le champ 2.
Je sais qu'il existe de nombreuses solutions, mais j'en cherche une simple qui puisse alléger mon code; en indiquant juste le numéro du champ qui m'interesse (et que je connais a priori).
Merci d'avance!
teab
Une petite question concernant la commande sed.
Voila mon problème. J'ai un fichier texte (toto.txt) qui contient 3 colonnes de nombres. Je dois remplacer à la ligne N (=15 par ex) le champ 3 par une chaine que je noterai newstr. Le champ 3 est une chaine que j'appelle oldstr.
fichier: str1 str2 oldstring
Jusqu'à présent, je faisais:
sed -i '15 s/oldstr/newstr/' toto.txt
resultat --> str1 str2 newstring
donc cela marche très bien sauf si le champ 2 a la même valeur que le champ 3:
fichier: str1 oldstr oldstr
Car dans ce cas il me remplace le champ 2.
Je sais qu'il existe de nombreuses solutions, mais j'en cherche une simple qui puisse alléger mon code; en indiquant juste le numéro du champ qui m'interesse (et que je connais a priori).
Merci d'avance!
teab
A voir également:
- Specifier numéro du champ, command sed ou awk
- Numero prive - Guide
- Numéro père noël whatsapp - Accueil - Messagerie instantanée
- Sfc scannow command - Guide
- Numero imei - Guide
- Trouver le numéro de quelqu'un avec son snap - Forum Snapchat
2 réponses
Salut,
2 solutions. Si tu sais quelle occurrence remplacée, 1ère solution, si tu ne sais pas le nombre d'occurrences à l'avance, 2nd solution :
;-))
2 solutions. Si tu sais quelle occurrence remplacée, 1ère solution, si tu ne sais pas le nombre d'occurrences à l'avance, 2nd solution :
jp@jp-kermic:~$ cat teab fichier: str1 str2 oldstr fichier:str1 oldstr oldstr jp@jp-kermic:~$ sed 's/oldstr/newstr/2' teab fichier: str1 str2 oldstr fichier:str1 oldstr newstr jp@jp-kermic:~$ sed 's/\(.*\)oldstr/\1newstr/' teab fichier: str1 str2 newstr fichier:str1 oldstr newstr jp@jp-kermic:~$
;-))
hello
pour change partiellement ou entèrement un champ spécifique avec awk
pour change partiellement ou entèrement un champ spécifique avec awk
$ echo olstr oldstr oldstr oldstr | awk -v c=3 '{sub("old", "new", $c);print}' olstr oldstr newstr oldstr $ $ echo olstr oldstr oldstr oldstr | awk -v c=2 '{sub("old", "new", $c);print}' olstr newstr oldstr oldstr $ $ echo olstr oldstr oldstr oldstr | awk -v c=2 '{$c="newstr";print}' olstr newstr oldstr oldstr $ $ echo olstr oldstr oldstr oldstr | awk -v c=4 '{$c="newstr";print}' olstr oldstr oldstr newstr $
ok alors la en effet tout est écrit dans le fichier!
MAIS cette méthode engendre un problème.
Voici ma ligne type dans mon fichier toto.txt
1.96000E+03 0.00000E+00 0.00000E+00 | XX = f(Q HP etg.2)
En procédant comme tu me l'as précisé, l'espace de début de ligne est supprimé, les deux espaces entre les champs se transforment en un seul espace et le vide entre le dernier champ et le | également.
Or ce fichier doit être rigoureusement formatter de la même manière que celui d'origine.
As tu une astuce? Ou dois-je me lancer sur une toute autre piste?
Merci pour ton aide précieuse.
MAIS cette méthode engendre un problème.
Voici ma ligne type dans mon fichier toto.txt
1.96000E+03 0.00000E+00 0.00000E+00 | XX = f(Q HP etg.2)
En procédant comme tu me l'as précisé, l'espace de début de ligne est supprimé, les deux espaces entre les champs se transforment en un seul espace et le vide entre le dernier champ et le | également.
Or ce fichier doit être rigoureusement formatter de la même manière que celui d'origine.
As tu une astuce? Ou dois-je me lancer sur une toute autre piste?
Merci pour ton aide précieuse.
Je ne connais effectivement pas l'occurence.
Donc je me suis tourné vers ta seconde méthode. Le problème est que j'ai besoin de spécifier la ligne dans la commande sed; si je la spécifie, et que je run mon script, toute la ligne est remplacée!
Erreur de ma part ou est-ce normal?
Que me conseillez-vous?
Cordialement,
teab
;-))
Toutefois, elle me semble limitée. Je m'explique. Imaginons que j'ai en fait cette ligne:
4 olstr oldstr oldstr
Je veux cette fois remplacer uniquement le deuxième champ par newstr. C'est faisable avec la première méthode que tu avais proposé, mais cela m'oblige à rajouter une ligne de code en faisant une boucle conditionnelle. C'est pour ça que je cherchais une méthode qui me permettre de spécifier le numéro du champ et non de l'occurence.
Tu vois ce que je veux dire?
Si tu n'as pas mieux ce n'est pas grave, c'est déjà très bien!
une méthode qui me permettre de spécifier le numéro du champ et non de l'occurence.
Sed n'est pas fait pour ça ;-(
Sed est un éditeur de flux orienté ligne et non un éditeur de flux orienté champ. Pour ça il te faut te tourner vers "awk", qui lui est prévu pour traiter les "champs".
J'arrive à l'utiliser pour la lecture de fichier, mais pas pour le remplacement!