Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/09/2011, 16h48   #1
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Par défaut awk et boucle for

Bonjour a tous.

J'ai un fichier texte avec des enregistrements ..1000 pour être précis.
Dans chaque enregistrement j'ai un champ =866 avec des infos.
La commande nawk ci-dessous formate le champ =866, le transforme en =952 et change des données à l’intérieur.
Le awk marche bien, mais un des champs doit avoir une valeur incrémentée de 1 pour chaque enregistrement dans le fichier :

Exemple du fichier (je colle pas tout car il est long)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
=LDR  00795nas  2200193 i 4500
=005  20100728125529.0
=008  920520c1989\\\\-usmr\\\\\\\\\0\\\\\eng\\
=022  0\$a1040-2446
=041  0\$aeng
=210  1\$aAcad Med
=245  00$aAcademic Medicine / $cAssociation of American Medical Colleges.
=260  \\$aPhiladelphia : $bAssociation American Medical Colleges, $c1989.
=300  \\$c24 cm.
=310  \\$aMensual
=530  \\$aDisponible en versi{dbldotb}n electr{dbldotb}nica desde 2000.
=650  \4$aMedicina.
=780  00$aEs continuaci{dbldotb}n de. $t"Journal of Medical Education" $xISSN 0022-2577
=856  \\$uhttp://ovidsp.ovid.com/ovidweb.cgi?T=JS&MODE=ovid&NEWS=n&PAGE=toc&D=ovft&AN=00001888-000000000-00000   $zAcceso al texto completo
=866  \\$aBNCS-CH 1989 (1990)1991(1992)1993-96(1997)1998-2001(2002-2005)2006-2008.
Le champs =866 devient ça une fois formaté :
Code :
=952 \\$aBNCS-CH\\$bBNCS-CH\\$h1989\\$oBNCS-CH0000001\\$pBNCS-CH0000001\\$yJNL
La commande est:
Code :
nawk -F"[\$a ]" '{if ($0~/^=866/) {print "=952",$3"$a"$5$3"$b"$5"\\\\$h"$6"\\\\$o"$5"0000001\\\$p"$5"0000001\\\\$yJNL" } else {print $0}}' revistas1.txt >luis.txt
Le problème c'est que je voudrais ces 2 champs là incrémentés de 1 pour chaque enregistrement:
Code :
$o"$5"0000001\\\$p"$5"0000001
Donc le $o et $p pour l'enregistrement suivant serait:
Code :
1
2
3
4
$o"$5"0000002\\\$p"$5"0000002
...
dernier
$o"$5"0000001000\\\$p"$5"0000001000

J'ai pensé faire une boucle for dans le awk, mais je n'y arrive pas.
Quelqu'un connait l'astuce?
Ça serait quelque chose comme:

Code :
$o"$5"000000"$i\\\$p"$5"000000"$i
D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 16h56   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

une idée :
Code :
 printf '%s\n' {a..l} | awk 'increment = sprintf("%.6d\n",(++increment)) {print "increment = "increment}'
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h00   #3
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonjour

cette commande que vous proposez, je l’exécute après le nawk?
La commande nawk je dois l’exécuter obligé car ça me formate mon fichier texte. A quel moment j’exécute votre commande?
Je dois passer le nom de fichier quelque part ?

D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h16   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
c'est seulement pour te montrer comment incrémenter une variable qui doit respecter un certain format.
Il faut l'adapter, et le replacer dans ton code awk.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h28   #5
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Uffff
je sais pas si je vais reussir a faire ça tout seul

donc ça serait:

Code :
nawk -F"[\$a ]" '{if ($0~/^=866/) {print "=952",$3"$a"$5$3"$b"$5"\\\\$h"$6"\\\\| awk 'increment = sprintf("%.6d\n",(++increment)) {print "increment = "increment}'\\$yJNL" } else {print $0}}' revistas1.txt >luis.txt
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 18h08   #6
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
nan, plutôt :
Code :
nawk -F"[\$a ]" '{if ($0~/^=866/) { increment = sprintf("%.6d",(++increment)); print "=952",$3"$a"$5$3"$b"$5"\\\\$h"$6"\\\\increment\\$yJNL" } else {print $0}}' revistas1.txt >lu    is.txt
plus ou moins
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 21h28   #7
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonsoir

alors là je pige pas, regarde ce que ça donne:

Code:

Code :
 nawk -F"[\$a ]" '{if ($0~/^=866/) { increment = sprintf("%.6d",(++increment)); print "=952",$3"$a"$5$3"$b"$5"\\\\$h"$6"\\\\increment\\$yJNL" } else {print $0}}' revistas1.txt >luis.txt
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
=LDR  00795nas  2200193 i 4500
=005  20100728125529.0
=008  920520c1989\\\\-usmr\\\\\\\\\0\\\\\eng\\
=022  0\$a1040-2446
=041  0\$aeng
=210  1\$aAcad Med
=245  00$aAcademic Medicine / $cAssociation of American Medical Colleges.
=260  \\$aPhiladelphia : $bAssociation American Medical Colleges, $c1989.
=300  \\$c24 cm.
=310  \\$aMensual
=530  \\$aDisponible en versi{dbldotb}n electr{dbldotb}nica desde 2000.
=650  \4$aMedicina.
=780  00$aEs continuaci{dbldotb}n de. $t"Journal of Medical Education" $xISSN 0022-2577
=856  \\$uhttp://ovidsp.ovid.com/ovidweb.cgi?T=JS&MODE=ovid&NEWS=n&PAGE=toc&D=ovft&AN=00001888-000000000-00000   $zAcceso al texto completo
=952 \\$aBNCS-CH\\$bBNCS-CH\\$h1989\\increment\$yJNL
Je suppose que increment c'est la variable qui doit s’incrémenter ?
Excuse mais je ne suis pas admin sys, c'est comme du chinois ces codes.
EN fait ce que je voudrais c'est que à 2 endroits différents de la chaine, apparaisse un code + son incrément
Le code est une suite de 5 zéros et coller à ça l’incrément
Donc ça ferait:
000001
000002
...
000001000
La ligne =952 devrait etre comme ceci:
Code :
=952 \\$aBNCS-CH\\$bBNCS-CH\\$h1989\\$o000001\\$p000001\\$yJNL
Le registre suivant comme ceci:
Code :
=952 \\$aBNCS-CH\\$bBNCS-CH\\$h1989\\$o000002\\$p000002\\$yJNL
Etc jusqu'a 1000.

T'en penses quoi? c'est faisable?
D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 22h06   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
ok, donc pas de formatage (c'est moins drôle) :
Code :
1
2
3
4
5
6
7
awk -F"[\$a ]" '{
   if ($0~/^=866/) {
      print "=952",$3"$a"$5$3"$b"$5"\\\\$h"$6"\\\\$o"$5"000000(++inc)"\\\$p"$5"000000"inc"\\\\$yJNL"
   } else {
      print $0
   }
}' revistas1.txt >luis.txt
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 22h21   #9
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
A ouais? jejeje tu veux du formatage?

Bon regarde, ça donne ceci:

Code :
1
2
3
awk -F"[\$a ]" '{if ($0~/^=866/) {print "=952",$3"$a"$5$3"$b"$5"\\\\$h"$6"\\\\$o"$5"000000(++inc)"\\\$p"$5"000000"inc"\\\\$yJNL"} else {print $0}}' revistas1.txt >luis.txt
awk: 1: unexpected character '\'
awk: line 1: runaway string constant "} else {pr ...
Y'a un " de trop?
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 04h07   #10
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
c'est un " qui a disparu lors de la copie.
Code :
1
2
3
4
5
6
7
8
awk -F"[\$a ]" '{
   if ($0~/^=866/) {
      print "=952",$3"$a"$5$3"$b"$5"\\\\$h"$6"\\\\$o"$5"000000"(++inc)"\\\$p"$5"000000"inc"\\\\$yJNL"
#                                                             ^ici
   } else {
      print $0
   }
}' revistas1.txt >luis.txt
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 09h20   #11
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonjour,

Hooo cool cette fois c'est la bonne.
Merci mil fois c'est cool.

Si t'as besoin d'aide avec postgres orace ou mysql, avise.

Ciao
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h16.


 
 
 
 
Partenaires

Hébergement Web