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 01/12/2011, 18h35   #1
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
Par défaut Filtre + script

Bonjour à tous,

Je galère sur un matching de données:

J'essaie à partir d'une liste contenant:

TMP_LISTE3
0001
0002
0003
0004
....

de matcher avec les entrées de ce fichier:

TMP_LISTE01
9999999999999000199999
9999999999999000299999
9999999999999000499999

je suis en ksh donc je code ceci:


Code :
1
2
3
4
5
6
 
while read line 
do
echo $line
awk '{var1=substr($0,14,4) ; if (var1 == $line ) { print $0;}}' >> ${TMP_LISTE4}
done < ${TMP_LISTE3}
J'ai essayé avant avec un grep, mais ça ne marche pas...
Code :
#grep '^.\{13\}${line}' ${TMP_LISTE01} >> ${TMP_LISTE4}
avec fgrep je ne sais pas faire du positionnel sinon je fais juste

Code :
fgrep -f ${TMP_LISTE3} ${TMP_LISTE01} > ${TMP_LISTE4}
Si une âme charitable pouvait m'aider ?

Merci.
erustika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 18h45   #2
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,

La position est un facteur déterminant ou pas ?

Sans quoi un simple fgrep -f TMP_LISTE3 TMP_LISTE01 devrait le faire
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2011, 18h46   #3
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,

ni awk ni grep ne sont nécesaires pour tester une correspondance.
par exemple :
Code :
1
2
3
4
5
var=abcdefghi
if [[ $var =~ def ]]
then echo OK
else echo KO
fi
ça dépend peut-être des versions de ksh (que j'utilise peu, et uniquement sur GNU/Linux)
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2011, 19h05   #4
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
Sinon...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cat fic1
0001
0002
0003
0005
 
$ cat fic2
9999999999999000199999
9999999999999000299999
9999999999999000499999
 
$ while read line;do egrep ".{13}${line}" fic2;done < fic1
9999999999999000199999
9999999999999000299999
 
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2011, 20h51   #5
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
Citation:
Envoyé par N_BaH Voir le message
Bonjour,

ni awk ni grep ne sont nécesaires pour tester une correspondance.
par exemple :
Code :
1
2
3
4
5
var=abcdefghi
if [[ $var =~ def ]]
then echo OK
else echo KO
fi
ça dépend peut-être des versions de ksh (que j'utilise peu, et uniquement sur GNU/Linux)
Désolé, je ne vois pas trop comment utiliser cette syntaxe.

Citation:
Envoyé par zipe31 Voir le message
Salut,

La position est un facteur déterminant ou pas ?

Sans quoi un simple fgrep -f TMP_LISTE3 TMP_LISTE01 devrait le faire
J'ai essayé mais ça me récupère des entrées qui ne m'intéresse pas, oui il faut absolument que ce soit positionnel.

egrep, n'a pas l'air de fonctionner chez moi (je trouverai la raison bientôt..), j'utilise cette syntaxe de grep:
Code :
1
2
 
grep '.^\{13\}[0][0][0][1]' fic2
En faite si je pouvais récupérer ma variable éclaté sur plusieurs lors de ma boucle:

Code :
1
2
3
4
5
6
7
8
9
10
11
echo $tmp 
0001
 
echo $tmp1
0
echo $tmp2
0
echo $tmp3
0
echo $tmp4
1
du coup c'est terminé:

Code :
grep '.^\{13\}[$tmp1][$tmp2][$tmp3][$tmp4]' fic2
Je ne vois pas comment découper ma variable?
erustika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 22h16   #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
Citation:
Désolé, je ne vois pas trop comment utiliser cette syntaxe.
±telle quelle

en reprenant l'exemple de zipe31 :
Code :
1
2
3
4
5
6
7
8
while read line
do while read line2
    do motif=".{13}${line2}"
      if [[ $line2 =~ $motif ]]
      then echo "$line2"
      fi
   done < fic2
done < fic1
mais bon , j'avais mal lu le contexte, et ça c'est juste pour avoir raison. na !

Citation:
En faite si je pouvais récupérer ma variable éclaté sur plusieurs lors de ma boucle:
tu peux t'inspirer de ce qui a été dit ici
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2011, 22h20   #7
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
Merci beaucoup à vous deux, je regarde ça demain et je vous redis ça !
erustika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 07h26   #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
Citation:
egrep, n'a pas l'air de fonctionner chez moi (je trouverai la raison bientôt..)
Quel système ? Quelle version de "grep" ?

Et avec grep -E qu'en est-il ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2011, 12h54   #9
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
Citation:
Envoyé par N_BaH Voir le message
±telle quelle

en reprenant l'exemple de zipe31 :
Code :
1
2
3
4
5
6
7
8
while read line
do while read line2
    do motif=".{13}${line2}"
      if [[ $line2 =~ $motif ]]
      then echo "$line2"
      fi
   done < fic2
done < fic1
mais bon , j'avais mal lu le contexte, et ça c'est juste pour avoir raison. na !

tu peux t'inspirer de ce qui a été dit ici

le ~ provoque une erreur de syntaxe, en le supprimant, je récupère du coup fic2 en entier

Citation:
Envoyé par zipe31 Voir le message
Quel système ? Quelle version de "grep" ?

Et avec grep -E qu'en est-il ?
La commande fonctionne avec egrep et grep -E, seulement elle fonctionne un peut comme fgrep et me ramène des entrées que je ne souhaites pas:

ex:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat fic1
0001
0002
0003
0005
 
$ cat fic2
9999999999999000199999
9999999999999000299999
99999999999990004999990001
 
$ while read line;do egrep ".{13}${line}" fic2;done < fic1
9999999999999000199999
9999999999999000299999
99999999999990004999990001
 
$
Le vrai problème c'est que dans ma commande awk, la variable $line n'est pas reconnue

Code :
1
2
3
4
5
6
 
while read line 
do
echo $line
awk '{var1=substr($0,14,4) ; if (var1 == $line ) { print $0;}}' ${TMP_LISTE01} >> ${TMP_LISTE4}
done < ${TMP_LISTE3}
il faut la passer en paramètre

Code :
1
2
3
4
5
6
 
while read line 
do
echo $line
awk -v v2=${line} '{v1=substr($0,14,4); if (v2 == v1) {print $0;}}' ${TMP_LISTE01} >> ${TMP_LISTE4}
done < ${TMP_LISTE3}
fallait le voir...

Pour mon découpage de variable c'est tout bête en faite:

C'est dommage qu'aucune de vos méthodes ne marche chez moi enfin merci beaucoup à vous deux, vous m'avez permis d'avancer sur ma problématique
erustika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 15h00   #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
${PATH:1:3} ça, ce n'est déjà plus du SH, alors =~ devrait être accepté

bien que ce que j'ai écrit soit moche, et qu'il soit préférable de tout faire en Awk (tant qu'on y est), par curiosité, avec quel shell et quelle version fais-tu ce script ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 15h21   #11
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
Code :
1
2
 echo ${BASH_VERSION[@]}
3.00.15(1)-release
le script
l'erreur qui ressort est:

Code :
script2.ksh[199]: syntax error: `$line2' missing expression operator
sans le ~ je n'ai plus d'erreur de syntaxe.
erustika est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 18h01   #12
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
quelle version de ksh ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 19h28   #13
Nouveau Membre du Club
 
Femme
Inscription : août 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 22
Points : 29
Points : 29
PD KSH v5.2.14 99/07/13.2
erustika 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 14h59.


 
 
 
 
Partenaires

Hébergement Web