J'ai un fichier qui contient plusieurs champ sans que j'en connaisse le nombre Fic1:
fzz,fzf,zffzfzfz,ethrthrgtfhrfh,...
J'aimerais prendre chaque champ et créer un nouveau fichier Fic2:
fzz
fzz
zffzfzfz
ethrthrgtfhrfh
...
J'ai essayé en ksh:
#!/bin/ksh
awk ' BEGIN{FS=":"}
{
for (i=1;i=<NF;i++)
{ print $i }
}
END{print"C est fini"} ' /tmp/Fic1
mais j'obtiens:
syntax error The source line is 3.
The error context is
for >>> (i=1;i=< <<< NF;i++)
awk: The statement cannot be correctly parsed.
The source line is 3.
awk: The statement cannot be correctly parsed.
The source line is 3.
Pourquoi?
Comment faire?
Merci!
Philippe
---------------
Dur de commencer le Shell...
Publicité
Posté le 24-08-2006 à 14:31:43
Elmoricq
Modérateur
Posté le 24-08-2006 à 14:48:34
C'est <=, et non =<
( man awk )
Message édité par Elmoricq le 24-08-2006 à 14:48:48
Philippe1971
Posté le 24-08-2006 à 18:46:45
Je te remercie!
(man thank you)
---------------
Dur de commencer le Shell...
Philippe1971
Posté le 24-08-2006 à 18:53:43
J'ai mon fichier FIC1 en entré et le script suivant:
awk ' BEGIN{FS=","}
{
for (i=1;i<=NF;i++)
{ print $i }
}
END{print"C est fini"} ' FIC1
Le résultat me convient mais j'aimerais le mettre en sortie dans un fichier FIC2.
Comment faire?
Merci!
---------------
Dur de commencer le Shell...
betsamee
Asterisk Zeperyl
Posté le 24-08-2006 à 19:35:56
sh tonscript.sh > FIC2
Message édité par betsamee le 24-08-2006 à 19:36:35
Philippe1971
Posté le 24-08-2006 à 19:40:20
D'accord mais si je souhaite créer le fichier FIC2 à l'intérieur du script?
D'accord mais si je souhaite créer le fichier FIC2 à l'intérieur du script?
Pour créer le fichier à l'intérieur du script :
awk ' BEGIN{FS=","} { for (i=1;i<=NF;i++) { print $i } } END{print"C est fini"} ' FIC1 > FIC2
A essayer (non testé):
# Les séparateurs de champs en entrée (FS)
# et en sortie (OFS) sont redéfinis.
# Toutes les lignes en entrée (FIC1) sont lues,
# affichées et stockées dans FIC2
awk -v FS="," -v OFS="\n" '{ print }' FIC1 > FIC2
Jean-Pierre.
Philippe1971
Posté le 25-08-2006 à 12:02:28
Pour le "fichier à l'intérieur du script" c'est bon: merci beaucoup.
Cela ne fonctionne pas pour la solution "awk"...
Par contre j'aimerais bien abuser de ta disponibilité pour un autre problème:
J'ai:
$ cat nfs1
/explexpl
/app/archive_envapp/archive_env
/helios2/env4thelios/env4t
Je veux obtenir:
/explexpl,/app/archive_envapp/archive_env,/helios2/env4thelios/env4t
Je fais:
$ sed 'N;s/\n/,/' nfs1
J'obtiens:
/explexpl,/app/archive_envapp/archive_env
Pour le "fichier à l'intérieur du script" c'est bon: merci beaucoup.
Cela ne fonctionne pas pour la solution "awk"...
Par contre j'aimerais bien abuser de ta disponibilité pour un autre problème:
J'ai:
$ cat nfs1
/explexpl
/app/archive_envapp/archive_env
/helios2/env4thelios/env4t
Je veux obtenir:
/explexpl,/app/archive_envapp/archive_env,/helios2/env4thelios/env4t
Je fais:
$ sed 'N;s/\n/,/' nfs1
J'obtiens:
/explexpl,/app/archive_envapp/archive_env
(ah, et pour répondre à la question : il faut utiliser le modificateur /g à sed, sinon il n'exécute le pattern qu'une seule fois : sed 'N;s/\n/,/g' nfs1 )
Message édité par Elmoricq le 26-08-2006 à 12:15:00
Pour le "fichier à l'intérieur du script" c'est bon: merci beaucoup.
Cela ne fonctionne pas pour la solution "awk"...
Il faut modifier un des champs pour forcer AWK à décomposer/reccomposer la ligne en utilisant OFS. En fait on fait semblant de modiier le champ $1 en lui concaténant une chaîne vide.
J'ai testé avec MAWK, et déjà utilisé la technique avec AWK (qui est nommé NAWK sur certains Unix) :
# Les séparateurs de champs en entrée (FS) # et en sortie (OFS) sont redéfinis. # Toutes les lignes en entrée (FIC1) sont lues. # On fait semblant de modifier $1 pour que AWK # recompose la ligne en utilisant OFS.
# Les lignes sont affichées et stockées dans FIC2