Extraction de champ par awk

Extraction de champ par awk - Shell/Batch - Programmation

Marsh Posté le 24-08-2006 à 14:31:43    

Bonjour!
 
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...
Reply

Marsh Posté le 24-08-2006 à 14:31:43   

Reply

Marsh 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
Reply

Marsh Posté le 24-08-2006 à 18:46:45    

Je te remercie!
 
(man thank you)


---------------
Dur de commencer le Shell...
Reply

Marsh 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...
Reply

Marsh Posté le 24-08-2006 à 19:35:56    

sh tonscript.sh > FIC2


Message édité par betsamee le 24-08-2006 à 19:36:35
Reply

Marsh Posté le 24-08-2006 à 19:40:20    

D'accord mais si je souhaite créer le fichier FIC2 à l'intérieur du script?


---------------
Dur de commencer le Shell...
Reply

Marsh Posté le 25-08-2006 à 11:48:16    

Philippe1971 a écrit :

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.

Reply

Marsh 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
/expl:/expl
/app/archive_env:/app/archive_env
/helios2/env4t:/helios/env4t
 
 
Je veux obtenir:
/expl:/expl,/app/archive_env:/app/archive_env,/helios2/env4t:/helios/env4t
 
Je fais:
$ sed 'N;s/\n/,/' nfs1
J'obtiens:
/expl:/expl,/app/archive_env:/app/archive_env
 
Pourquoi?
Comment faire?
 


---------------
Dur de commencer le Shell...
Reply

Marsh Posté le 25-08-2006 à 12:05:21    

Mets ton code entre des balises [fixed][/fixed], parce qu'on a du mal à le lire avec tous ces smilies. :o

Reply

Marsh Posté le 25-08-2006 à 12:06:59    

Ah excuse: en fait à la place du smily il y a un ":"


---------------
Dur de commencer le Shell...
Reply

Marsh Posté le 25-08-2006 à 12:06:59   

Reply

Marsh Posté le 26-08-2006 à 11:42:39    

Philippe1971 a écrit :

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
/expl:/expl
/app/archive_env:/app/archive_env
/helios2/env4t:/helios/env4t
 
 
Je veux obtenir:
/expl:/expl,/app/archive_env:/app/archive_env,/helios2/env4t:/helios/env4t
 
Je fais:
$ sed 'N;s/\n/,/' nfs1
J'obtiens:
/expl:/expl,/app/archive_env:/app/archive_env
 
Pourquoi?
Comment faire?


http://forum.hardware.fr/hardwaref [...] -1.htm#bas

Reply

Marsh Posté le 26-08-2006 à 12:14:24    

(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
Reply

Marsh Posté le 26-08-2006 à 12:26:43    

Philippe1971 a écrit :

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  
 
awk -v FS="," -v OFS="\n" '{ $1=$1 " ";print $0}' FIC1 > FIC2


 
 
Jean-Pierre.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed