Utilisation de sed - Shell/Batch - Programmation
Marsh Posté le 26-08-2006 à 09:58:21
Philippe1971 a écrit : Bonjour! |
Je connais pas sed dans toutes ses subtilités. En général, je m'en sers pour transformer certains caractères d'une ligne en certains autres mais jamais pour concaténer des lignes.
Ton truc, moi je le ferais en awk qui est plus fin dans ses possibilités
awk '{printf("%s,", $0)} END {printf("\n" )}' nfs1 |
La subtilité de ce truc, c'est que je ne mets pas de caractère "retour à la ligne" dans le "printf" central, je ne le mets qu'à la fin dans le bloc "END" donc toutes tes lignes seront concaténées en une seule.
Petit bug: la ligne se terminera par une virgule. Si cela te gène tu peux la supprimer en y rajoutant un "sed"
awk '{printf("%s,", $0)} END {printf("\n" )}' nfs1 |sed -e "s/,$//" |
Cours complet de shell ici: http://fr.lang.free.fr/cours/Shell_v1.4.pdf
Marsh Posté le 26-08-2006 à 13:14:21
Une autre solution avec AWK :
awk ' |
Pour la version SED, une solution possible (non testée) :
sed -n '$!N;${s/\n/,/g;p;}' nfs1 |
Jean-Pierre.
Marsh Posté le 29-08-2006 à 07:38:23
Merci Sve@r la commande:
awk '{printf("%s,", $0)} END {printf("\n" )}' nfs1 |sed -e "s/,$//"
remplie mon objectif!
De même avec la proposition de aigles pour awk (pas sed).
Merci à vous deux!
Philippe
Marsh Posté le 29-08-2006 à 14:30:06
Philippe1971 a écrit : Merci Sve@r la commande: |
Ouais, je l'ai tapée rapidement sans trop me creuser la tête.
Question rapidité, je peux pas dire laquelle sera la meilleure. La version de "aigles" un peu plus subtile que la mienne ne lance qu'un processus alors que moi j'en enchaine 2... mais lui fait un test à chaque itération pour savoir s'il faut mettre la virgule ou pas alors que je n'en fais pas.
Mais je pense que si je devais adopter la version de "aigles", j'inverserais le test de façon à ce que le cas le plus courant soit mis en premier. Autrement dit, je remplacerais
printf("%s%s", (NR==1 ? "" : "," ), $0) |
par
printf("%s%s", (NR!=1 ? "," : "" ), $0) |
Marsh Posté le 30-08-2006 à 10:47:56
En fait l'utilisation d'un test est inutile, on peut simplement faire :
printf("%s%s", sep, $0); |
Pour la première ligne lue, la variable sep est égale à "" (car non initialisée), par la suite elle vaut ",".
Jean-Pierre.
Marsh Posté le 30-08-2006 à 13:23:17
Merci Sve@r et aigles!
Je ne l'ai pas fait mais pour comparer les résultats d'exécution il est possible -si mes souvenirs sont bons- d'utiliser la commande time.
Marsh Posté le 30-08-2006 à 20:50:03
aigles a écrit : En fait l'utilisation d'un test est inutile, on peut simplement faire :
Pour la première ligne lue, la variable sep est égale à "" (car non initialisée), par la suite elle vaut ",". |
EXCELLENT !!!!
Philippe1971 a écrit : Merci Sve@r et aigles! |
Exact. Mais pour un truc aussi mineur, personne n'ira se prendre la tête...
Marsh Posté le 31-08-2006 à 07:31:17
Merci pour toutes ses solutions!
Marsh Posté le 05-09-2006 à 16:53:56
Bonjour, SED c'est un commande linux compatible windows pour remplacer des cheînes de caractéres ?
Vous ne conaitriez pas un tutorial en francais pour la commande sed ?
Marsh Posté le 05-09-2006 à 18:50:53
http://www.google.fr/search?hl=fr& [...] cher&meta=
http://www.shellunix.com/sed.html
Marsh Posté le 25-08-2006 à 09:22:52
Bonjour!
Voilà mon problème (en ksh)...
J'ai:
$ cat nfs1
/explexpl
/app/archive_envapp/archive_env
/helios2/env4thelios/env4t
Je veux obtenir (virgule comme séparateur):
/explexpl,/app/archive_envapp/archive_env,/helios2/env4thelios/env4t
Je fais:
$ sed 'N;s/\n/,/' nfs1
J'obtiens:
/explexpl,/app/archive_envapp/archive_env
Pourquoi manque t-il la dernière ligne?
Comment faire?
Merci!
---------------
Dur de commencer le Shell...