Remplacement de caractères dans un champ d'un fichier tabulé

Remplacement de caractères dans un champ d'un fichier tabulé - Linux et OS Alternatifs

Marsh Posté le 16-03-2004 à 12:56:11    

Bonjour,
Voilà j'ai un fichier tabulé, le séparateur est une tabulation. Il y a 12 champ au total et 1000 lignes. Dans le champ 10 et 11, je souhaite remplacer un caractère par un autre, je veux remplacer le point "." par une virgule ",". Sachant que tout ça doit obligatoirement se faire dans un script *.csh. Je pense utiliser la commande awk dans mon script, mais j'y connais pas grand chose en awk donc si qql un à des idées ou peux me guider. Merci !

Reply

Marsh Posté le 16-03-2004 à 12:56:11   

Reply

Marsh Posté le 16-03-2004 à 13:43:19    

Voilà qui devrais répondre à peu près à ton interrogation :
 
$ ll
total 4
-rw-rw-r--    1 yannig   yannig        176 mar 16 13:14 test.lst
$ cat test.lst
champ1;champ2;champ3;champ4;champ5,,;champ6
champ1;champ2;champ3;champ4;champ5,,;champ6
champ1;champ2;champ3;champ4;champ5,,;champ6
champ1;champ2;champ3;champ4;champ5,,;champ6
$ cat test.lst | awk -F\; '
{ gsub(",",".",$5) }
{ print $1 ";" $2 ";" $3 ";" $4 ";" $5 }'
champ1;champ2;champ3;champ4;champ5..
champ1;champ2;champ3;champ4;champ5..
champ1;champ2;champ3;champ4;champ5..
champ1;champ2;champ3;champ4;champ5..
 
Bonne journée !

Reply

Marsh Posté le 16-03-2004 à 14:11:48    

Merci beaucoup

Reply

Marsh Posté le 16-03-2004 à 17:35:07    

Après avoir testé, cela me donne une erreur :
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>cat test.lst
champ1;champ2;champ3,,;
champ1;champ2;champ3,,;
champ1;champ2;champ3,,;
champ1;champ2;champ3,,;
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>cat test.lst | awk -F\; '
> { gsub(",",".",$3) }
> {print $1 ";" $2 ";" $3 }'
awk: syntax error near line 2
awk: illegal statement near line 2

Reply

Marsh Posté le 16-03-2004 à 17:47:13    

/* Je remplace les ";" par une tabulation */
 
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>cat test.lst
champ1    champ2    champ3,,    
champ1    champ2    champ3,,    
champ1    champ2    champ3,,    
champ1    champ2    champ3,,    
 
/* Je compte le nombre de champs par lignes */
 
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>awk '{print NF}' test.lst
3
3
3
3
 
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>awk                  
awk: Usage: awk [-Fc] [-f source | 'cmds'] [files]
 
/* Je veux remplacer les "," par des "." et ERREUR */
 
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>awk '{ gsub(",",".",$3) }
> ' test.lst
awk: syntax error near line 1
awk: illegal statement near line 1
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>
 
Franchement je comprends pas le problème !
Si vous avez une idée, merci.

Reply

Marsh Posté le 17-03-2004 à 09:20:48    

Tu utilises un Solaris ? Dans ce cas, il faut utiliser l'utilitaire nawk pour que ça fonctionne. Dans le cas contraire, tu te retrouves avec une vieille version toute pourrite de cette utilitaire.
-------@-------:/bla/bla/bla> cat test.lst
champ1;champ2;champ3,,;
champ1;champ2;champ3,,;
champ1;champ2;champ3,,;
champ1;champ2;champ3,,;
-------@-------:/bla/bla/bla> cat test.lst | nawk -F\; '{ gsub(",",".",$3) } { print $1 ";" $2 ";" $3 }'
champ1;champ2;champ3..
champ1;champ2;champ3..
champ1;champ2;champ3..
champ1;champ2;champ3..
 
Bonne journée !

Reply

Marsh Posté le 17-03-2004 à 14:47:14    

Effectivement avec nawk cela marche la "," et remplacée par le ".". Mais ma question était de remplacer le "." par la ",". J'ai essayé la modification mais là encore un problème.
 
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>cat test.lst
champ1;champ2;champ.3;champ4;
champ1;champ2;champ.3;champ4;
champ1;champ2;champ.3;champ4;
champ1;champ2;champ.3;champ4;
 
SUNDEV:MUTUDEV:/home/sybase/prog/sebastien>cat test.lst | nawk -F\; '{ gsub(".",",",$3) } { print $1 ";" $2 ";" $3 ";" $4 }'
champ1;champ2;,,,,,,,;champ4
champ1;champ2;,,,,,,,;champ4
champ1;champ2;,,,,,,,;champ4
champ1;champ2;,,,,,,,;champ4
 
J'ai l'impression que le "." pause un problème.
Merci

Reply

Marsh Posté le 18-03-2004 à 10:58:44    

Bon, j'ai ta solution. Il suffit juste de remplacer "." par "\." parce qu'il s'agit d'une expression régulière mon petit gars ... Et que justement, le '.' représente tous les caractères (excepté le retour chariot, la fin et le début d'une expression).
 
Autre problème, le shell passe par là et interpréte tous les "\" pour les remplacer par les caractères spéciaux qu'ils sont censés représentés (\n,\t,\r etc). Comme il connait pas de \., il te remplace ça sans vergogne par '.'. Il faut donc doubler le \ ...
 
Bref voilà le résultat :
 
$ cat test.lst
champ1;champ2;champ.3;champ4;
champ1;champ2;champ.3;champ4;
champ1;champ2;champ.3;champ4;
champ1;champ2;champ.3;champ4;
 
$cat test.lst | nawk -F\; '{ gsub("\\.",",",$3) } { print $1 ";" $2 ";" $3 ";" $4 }'
 
Là, je pense que ton problème est résolu ...

Reply

Marsh Posté le 18-03-2004 à 13:02:36    

En fait cela déspécialise le caractère et permet d'interpréter le point comme un point.
Merci pour ton aide.
a+

Reply

Sujets relatifs:

Leave a Replay

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