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 10/05/2011, 19h13   #1
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
Par défaut Méthode pour substituer

Bonsoir,
J'ai un fichier dans lequel j'ai déjà filtré les enregistrements que je souhaitais via un sed -n.
Exemple :
Code :
cat $fic | sed -n '/30076/p' |  sed -n '/2019/p'  > $fictmp
Maintenant dans ce fichier $fictmp j'ai une date sur toutes les lignes de la forme YYYYMM.
Soit je récupère ma valeur qui se trouve toujours en position 5 sur 6 caractères et je substitue celle-ci par ma varibale que j'ai passé en paramètre (mais cela est très lourd vu le nombre de lignes de mes fichiers en entrée, et en plus cela ne fonctionne pas parfaitement), soit je ne travaille plus ligne par ligne, mais sur tout le fichier $fictmp et je lui demande de modifier les valeurs de la position 5 à 10 par celle du paramètre.

Savez vous comment faire cela ?
Merci
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/05/2011, 09h02   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Code :
cat $fic | sed -n '/30076/p' |  sed -n '/2019/p'  > $fictmp
est facilement obtimisable par
Code :
sed -n '/30076|2019/p' $fic > $fictemp
pour éviter les 3 pipes .... gagner donc beaucoup de temps.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 09h34   #3
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Citation:
Envoyé par frp31 Voir le message
Code :
sed -n '/30076|2019/p' $fic > $fictemp
Il faut protéger le "pipe" avec sed à l'instar de "grep" ou utiliser l'option "-r" :
Code :
1
2
3
sed -n '/30076\|2019/p' $fic
ou
sed -nr '/30076|2019/p' $fic
De plus le pipe est ici synonyme de OU l'un OU l'autre alors que je pense que la finalité (mais je peux me tromper) est ET l'un ET l'autre, qui se traduirait par :

Code :
sed -n '/30076/p' $fic | sed -n '/2019/p'
ou avec grep
Code :
grep '30076'  $fic | grep '2019'
et qu'on pourrait réduire à :
Code :
sed -n '/30076.*2019\|2019.*30076/p' $fic
ou avec grep :
Code :
grep -E '30076.*2019|2019.*30076'
Si toutefois on recherche à la fois une ligne contenant "30076" ET "2019" dans n'importe quel ordre...

Mais je le répète, j'ai peut être mal interprété la demande et dans ce cas là j'ai tout faux (ou presque, la protection du pipe étant exacte), et je m'en excuse par avance
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/05/2011, 09h41   #4
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
Merci bien.
Ca va me permettre d'optimiser.
Mais si j'ai d'autres "couples" de valeurs à chercher dans mes enregistrements, est-il préférable de rajouter des lignes tel que :
Code :
1
2
sed -n '/30076|2020/p' $fic >> $fictemp
sed -n '/30080|2022/p' $fic >> $fictemp
ou dois-je faire
Code :
sed -n '/30076|30080|2020|2022/p' $fic >> $fictemp
Mais pour revenir à ma question de susbtitution que me conseillez-vous ?
Car maintenant je suis sur la ligne et non sur la totalité du fichier.
Je veux remplacer la valeur existante de la position 5 à 10 incluse par celle amenée en paramètre yyyymm.

Si j'ai la valeur 201012 (dans mon fichier pos 5 à 10) et qu'en paramètre j'ai mis 201105, il me faut dans tout le fichier mettre 201105.

Merci bien.
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/05/2011, 09h58   #5
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Attention de bien relire les explications au-dessus concernant la protection du "pipe" avec "sed".

Pour les couples il faut utiliser la syntaxe (utilisation de l'option "-r", puis des parenthèses et des pipes) :

Code :
sed -nr '/(30076.*30080|30080.*30076)|(2020.*2022|2022.*2020)/p' $fic
Par contre tu n'as toujours pas dit si l'ordre de recherche était un critère, par exemple est-ce qu'il faut rechercher une ligne contenant le couple "30076 et 30080" dans cet ordre ou aussi comme "30080 et 30076" ?

Pour le reste de ta demande un exemple concret serait le bienvenu merci.
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/05/2011, 10h04   #6
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
je viens de tester cela :
Code :
123 sed -n '/30076\|2019/p' $fic
ou
Code :
sed -nr '/30076|2019/p' $fic
Mais cela ne fonctionne pas.
1er cas : résultat NULL
2ème cas : message d'erreur
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 11/05/2011, 10h16   #7
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par zipe31 Voir le message
Pour le reste de ta demande un exemple concret serait le bienvenu merci.
+1 on ne comprend plus rien là donne un exemple concret !

edit: et pense à donner le message d'erreur aussi tant qu'on y est
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/05/2011, 10h17   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Quel système ?
Quelle distrib ?
Quelle version de "sed" ?

On peut avoir un bout de ton fichier histoire qu'on teste de notre côté...

Un exemple où on cherche "toto suivi de tata ou tata suivi de toto" ou "tutu suivi de tyty ou tyty suivi de tutu" :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat plop
toto et tata
tata et toto
toto et titi
titi et tata
tutu et tyty
tyty et tutu
tutu et titi
titi et tyty

$ sed -nr '/(to.*ta|ta.*to)|(tu.*ty|ty.*tu)/p' plop
toto et tata
tata et toto
tutu et tyty
tyty et tutu
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/05/2011, 10h37   #9
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Citation:
Envoyé par zipe31 Voir le message
Attention de bien relire les explications au-dessus concernant la protection du "pipe" avec "sed".

Pour les couples il faut utiliser la syntaxe (utilisation de l'option "-r", puis des parenthèses et des pipes) :

Code :
sed -nr '/(30076.*30080|30080.*30076)|(2020.*2022|2022.*2020)/p' $fic
Par contre tu n'as toujours pas dit si l'ordre de recherche était un critère, par exemple est-ce qu'il faut rechercher une ligne contenant le couple "30076 et 30080" dans cet ordre ou aussi comme "30080 et 30076" ?

Pour le reste de ta demande un exemple concret serait le bienvenu merci.
bien vu
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/05/2011, 14h17   #10
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
La version du système :
SunOS devece 5.10 Generic_142900-03 sun4u sparc SUNW,Sun-Fire-15000

Je suis en ksh.
Pour la version de sed, je ne sais pas où trouver cela.

Un bout du fichier :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1LCEPTFDAI20110401
5DAI2011031010228096280229814527800200000000010310.11+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011030210228096280229814859500200000000007599.73+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011030810228096280264510010200200000000001282.85+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011031010228096280264510010200200000000001861.76+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011030810228096280264510022600200000000005287.81+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011030910228096280264510022600200000000026842.73+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011030410228096280264510032300200000000003038.07+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011030810228096280264510085400200000000098065.06+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011033008020226280264510091900200000000001480.66+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011031010228096280264510091900200000000011098.14+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
5DAI2011030310228096280264510098600200000000005447.84+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
  00030CR61
Est-ce que cela vous va ces 12 lignes ?
Seule la ligne avec les valeurs en gras sera sélectionnée dans cet exemple.
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/05/2011, 15h01   #11
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Ca nous va parfaitement, maintenant, que cherches-tu à faire exactement ?

Si j'ai bien compris ton premier post, tu veux trouver les lignes qui contiennent 30076 et 2019.

Et ensuite, tu veux remplacer les 6 caractères en position 5 (qui correspondent à une date au format YYYYMM) par d'autres caractères ?

En perl, ça donnerait ceci:
Code :
perl -ple 'substr($_,4,6)="201104" if (/64510/ && /2002/);' test > test2
L'option -p indique qu'on va lire chaque ligne du fichier, stocker la ligne lue dans une variable nommée $_ et à la fin des éventuels traitements, on affiche cette variable $_.
L'option -l indique que pour traiter chaque ligne, on retire déjà le symbole fin de ligne s'il est présent à la fin de la ligne, et qu'après avoir affiché la ligne, on ajoute à nouveau le symbole de fin de ligne (très utile pour contourner les problèmes de fin de ligne entre les OS et pour éviter d'être ennuyé par les sauts de lignes).
L'option -e indique que ce qui suit entre quote est le traitement à appliquer entre la lecture de la ligne et son affichage.
Explication du traitement :

if (/30076/ && /2019/) signifie "si la ligne contient 64510 et 2002"

substr($_,4,6)="201104" remplace le contenu de $_ (qui contient la ligne) à partir de la position 5 (4 compté à partir de 0) et sur 6 caractères par 201104. Comme cette commande est suivie du if précédent, ça ne fait la manipulation que si la condition est remplie (si la ligne contient 30076 et 2019).

J'ai modifié le critère de recherche car dans ton exemple, il n'y avait pas de ligne avec 30076 et 2019... donc j'ai pris 64510 et 2002 :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
$ cat test
1LCEPTFDAI20110401
5DAI2011031010228096280229814527800200000000010310.11+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030210228096280229814859500200000000007599.73+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030810228096280264510010200200000000001282.85+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011031010228096280264510010200200000000001861.76+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030810228096280264510022600200000000005287.81+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030910228096280264510022600200000000026842.73+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030410228096280264510032300200000000003038.07+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030810228096280264510085400200000000098065.06+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011031010228096280264510091900200000000001480.66+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011031010228096280264510091900200000000011098.14+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030310228096280264510098600200000000005447.84+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
$ perl -ple 'substr($_,4,6)="201104" if (/64510/ && /2002/);' test > test2
$ diff test test2
6c6
< 5DAI2011030810228096280264510010200200000000001282.85+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
---
> 5DAI2011040810228096280264510010200200000000001282.85+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
8c8
< 5DAI2011031010228096280264510010200200000000001861.76+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
---
> 5DAI2011041010228096280264510010200200000000001861.76+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
$ cat test2
1LCEPTFDAI20110401
5DAI2011031010228096280229814527800200000000010310.11+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030210228096280229814859500200000000007599.73+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011040810228096280264510010200200000000001282.85+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011041010228096280264510010200200000000001861.76+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030810228096280264510022600200000000005287.81+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030910228096280264510022600200000000026842.73+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030410228096280264510032300200000000003038.07+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030810228096280264510085400200000000098065.06+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011031010228096280264510091900200000000001480.66+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011031010228096280264510091900200000000011098.14+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
5DAI2011030310228096280264510098600200000000005447.84+850CREDIT DES REMISES A L'ENTREE 072ESCOMPTE EFFETS COMMERCE
00030CR61
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 11/05/2011, 15h15   #12
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
Oui j'ai modifié par la suite une des lignes car les données étaient fausses.

En tout cas tu as parfaitement compris ce que je souhaite faire.

Tu n'as pas d'autres moyens que le Perl. Ca m'est interdit ...
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/05/2011, 15h22   #13
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
En awk alors ?

Code :
awk '{if (/64510/ && /2002/) { $0 = substr($0,1,4) "201104" substr($0,11) } print}' test > test3
explication :

if (/64510/ && /2002/) idem que perl

$0 = substr($0,1,4) "201104" substr($0,11) on modifie $0 qui contient la ligne complète en prenant les 4 premiers caractères, concaténés à 201104 puis la fin de la ligne depuis le caractère 11
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 11/05/2011, 15h48   #14
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
Est-ce que cela donnerait un shell tel que celui-ci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/ksh
liste=lst_fic_so.txt
idmois=$1
ficlog=extract.log
if [ $# -ne 1 ]
then
        echo "Indiquer la date (YYYYMM) en parametre." | tee -a ${ficlog}
        exit 1
fi
#echo "Mois param : " $idmois
 
for fic in `cat ${liste}`
do
        nomfic=`echo ${fic} | cut -f1 -d.`
        ficold=$(date +%Y%m%d%H%M)_${nomfic}.old
        cp $fic $ficold
        fictmp=${nomfic}.tmp
        rm -f ${fictmp}
        sed -nr '/(30076.*2019)|(10468.*2240)|(10468.*2240)|(10468.*2245)|(10468.*2246)|(10468.*2247)/p' $fic > $fictmp
 
        awk '{$0=substr($0,1,4) "$idmois" substr($0,11)} print}' $fictmp > $fic
        rm -f ${fictmp}
        echo "Sauvegarde de l'ancien fichier  --> ${ficold}" | tee -a ${ficlog}
        echo "Creation du nouveau fichier --> ${fic}" | tee -a ${ficlog}
done
Résultat :

Citation:
sed: illegal option -- r
awk: syntax error near line 1
awk: bailing out near line 1
Sauvegarde de l'ancien fichier --> 201105111602_DAIDWR.old
Creation du nouveau fichier --> DAIDWR.txt
sed: illegal option -- r
awk: syntax error near line 1
awk: bailing out near line 1
Sauvegarde de l'ancien fichier --> 201105111602_PTFDWR.old
Creation du nouveau fichier --> PTFDWR.txt
sed: illegal option -- r
awk: syntax error near line 1
awk: bailing out near line 1
Sauvegarde de l'ancien fichier --> 201105111602_CHQTLAB-extract.old
Creation du nouveau fichier --> CHQTLAB-extract.txt
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 11/05/2011, 16h21   #15
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
1) Il vaut mieux tester la présence de paramètre avant de faire l'association:
Code :
1
2
3
4
5
6
if [ $# -ne 1 ]
then
echo "Indiquer la date (YYYYMM) en parametre." | tee -a ${ficlog}
exit 1
fi
idmois=$1
2) Il faut éviter les for ... in `cat ...`, préférer l'utilisation de read :
Code :
1
2
3
for fic in `cat ${liste}`
...
done
devient
Code :
1
2
3
while read fic
...
done < $liste
3) awk permet de faire grosso modo la même chose que sed (avec plus d'options), donc pas la peine de multiplier les appels à sed + awk dans un script

4) pas la peine non plus de multiplier les fichiers si ça n'est pas indispensable

En partant de ces différents points, et en supposant qu'il n'est pas non plus indispensables de supprimer l'extension de tes fichiers de départs pour les remplacer par un .old (ce qui est risqué si tu as 2 fichiers de même nom mais d'extension différente), voici un script qui devrait marcher :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/ksh
liste=lst_fic_so.txt
if [ $# -ne 1 ]
then
        echo "Indiquer la date (YYYYMM) en parametre."
        exit 1
fi
idmois=$1
 
while read fic
do
        ficold=$(date +%Y%m%d%H%M)_${fic}.old
        mv $fic $ficold
        awk '{if (/30076.*2019/ || /10468.*2240/ || /1010.*8096/) {$0=substr($0,1,4) "'$idmois'" substr($0,11)} print}' $ficold > $fic
done < lst_fic_so.txt
J'ai modifié la boucle sur les fichiers. Je commence par renommer le fichier en <date>_fichier.old.
Ensuite, je lance la commande awk sur le fichier renommé en redirigeant la sortie vers le fichier d'origine.
Dans l'exemple ci-dessus, je n'ai recopié que 2 des 6 critères que tu avais mis dans ton sed, et j'en ai mis un 3ème pour passer sur mes fichiers de test. Tu devrais pouvoir rajouter les critères dont tu as besoin

Edit : en plus, tes critères peuvent être simplifiés (il y a un doublon, et les 4 derniers sont presque tous identiques à 1 chiffre prêt) :
Code :
(30076.*2019)|<s>(10468.*2240)|</s>(10468.*2240)|(10468.*2245)|(10468.*2246)|(10468.*2247)
Code :
(30076.*2019)|(10468.*224[0567])
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 12/05/2011, 09h35   #16
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
Je vais tester cela ce matin et vous tiens au courant.
Merci encore pour votre aide.

J'ai cela en résultat :

Citation:
awk: syntax error near line 1
awk: illegal statement near line 1
awk: bailing out near line 1
awk: syntax error near line 1
awk: illegal statement near line 1
awk: bailing out near line 1
awk: syntax error near line 1
awk: illegal statement near line 1
awk: bailing out near line 1
Sauvegarde de l'ancien fichier --> 201105120955_CHQTLAB-extract.old
Creation du nouveau fichier -->
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/05/2011, 15h58   #17
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
Maintenant je n'ai plus d'erreur car j'ai utilisé nawk au lieu de awk.
Mais aucun filtre ne se fait.

Voici le script :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/ksh
liste=lst_fic_so.txt
ficlog=extract.log
if [ $# -ne 1 ]
then
        echo "Indiquer la date (YYYYMM) en parametre."
        exit 1
fi
idmois=$1
while read fic
do
        nomfic=`echo ${fic} | cut -f1 -d.`
        echo ${nomfic}
        ficold=$(date +%Y%m%d%H%M)_${nomfic}.old
        cp $fic $ficold
        cat /dev/null > $fic
        nawk '{if (/30076.*2019/ || /10468.*224[0567]/) {$0=substr($0,1,4) $idmois substr($0,11)} print }' $ficold > $fic
        echo "Sauvegarde de l'ancien fichier  --> ${ficold}" | tee -a ${ficlog}
        echo "Creation du nouveau fichier --> ${fic}" | tee -a ${ficlog}
done < $liste
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/05/2011, 16h29   #18
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
la commande doit-être ainsi avec notre awk :

Code :
nawk '{if (/30076.*2019/ || /10468.*224[0567]/) {print substr($0,1,4) ${idmois} substr($0,11)} }' $ficold > $fic
Seul hic c'est que :
Le filtre fonctionne uniquement si je ne mets pas la commande substr($0,1,4) ${idmois} substr($0,11)

il n'a pas l'air de reconnaitre idmois dans cette commande awk.
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 12/05/2011, 16h35   #19
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par patgabjoe Voir le message
Seul hic c'est que :
Le filtre fonctionne uniquement si je ne mets pas le commande substr($0,1,4) ${idmois} substr($0,11)

il n'a pas l'air de reconnaitre idmois dans cette commande awk.
Normal entre quote simple la variable ne peut être interprétée ;(

Soit :

Code :
nawk '{if (/30076.*2019/ || /10468.*224[0567]/) {print substr($0,1,4) '"${idmois}"' substr($0,11)} }' $ficold > $fic
Soit :

Code :
nawk -v IDMOIS=${idmois} '{if (/30076.*2019/ || /10468.*224[0567]/) {print substr($0,1,4) IDMOIS substr($0,11)} }' $ficold > $fic
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/05/2011, 10h00   #20
Candidat au titre de Membre du Club
 
Inscription : février 2008
Messages : 96
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 96
Points : 14
Points : 14
Exact.
C'est ce que j'avais réalisé par la suite.
Il fallait donc utiliser une variable et puis Nickel.

J'avais une autre question mais là c'est pour compresser mes fichiers qui sont dans ma liste car sinon notre filesystem sera plein.

Peut-être dois-je ouvrir un autre sujet ?

En tout cas merci à tous pour cette aide.
Ciao.
patgabjoe est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h43.


 
 
 
 
Partenaires

Hébergement Web