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 23/05/2011, 10h43   #1
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Par défaut Recherche plusieurs chaines dans une ligne

Bonjour,

J'ai deux fichiers. Le premier est un fichier de paramétrage et le second, un fichier de données.

fichier paramétrage ressemble à :
Code :
1
2
3
4
 
chaine01;chaine02;chaine03;chaine04
chaine05;chaine06;chaine07;chaine08
chaine09;chaine10;chaine11;chaine12
Je lis le fichier de paramétrage. Pour chaque ligne de ce fichier (colonne1, colonne2 et colonne4), je souhaite rechercher celles-ci dans le fichier de données.

le fichier de données ressemble à :
Code :
1
2
3
4
 
chaine01   chaine02      toto      chaine04.....
chaine05   chaine06      tata      chaine08.....
chaine12   chaine10      tata      chaine12......
La condition est la présence (& logique) des colonnes 1, 2 et 4 dans le fichier de données. Si l'une de des colonnes n'est pas présente dans le fichier de données, je ne prends pas l'enregistrement.

In fine, par rapport à cet exemple, dans mon fichier résultat, j'aurais
Code :
1
2
3
 
chaine01     chaine02       toto      chaine04.....
chaine05     chaine06       tata      chaine08.....
Quant à l’enregistrement
Code :
chaine12   chaine10      titi        chaine12......
Il ira à la poubelle car la première colonne du fichier param parle de "chaine09"

La commande grep peut-elle répondre à ce besoin ?
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h20   #2
Modérateur
 
Avatar de paissad
 
Homme Papa I. DIAKHATE
Étudiant
Inscription : avril 2006
Messages : 605
Détails du profil
Informations personnelles :
Nom : Homme Papa I. DIAKHATE
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2006
Messages : 605
Points : 1 433
Points : 1 433
Bonjour,
dis en un peu plus sur les chaînes de caractères (leur composition possible)
Est ce que ces chaînes (chaine1, chaine2 ....) peuvent contenir des espaces ?
Quel est le caractère d'espacement de tes colonnes dans le fichier de données (un espace ? une tabulation ? ...)
__________________
Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
Modérateur aux rubriques Linux/Unix et au chat du site.
http://blog.paissad.net
paissad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h39   #3
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
Tu peux utiliser IFS par exemple.

Version basique :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat filtre.txt
chaine01;chaine02;chaine03;chaine04
chaine05;chaine06;chaine07;chaine08
chaine09;chaine10;chaine11;chaine12
$ cat data.txt
chaine01   chaine02      toto      chaine04 ....
chaine05   chaine06      tata      chaine08 ....
chaine12   chaine10      tata      chaine12 .....
$ cat grep.bash
#!/bin/bash
 
while IFS=';' read colonne1 colonne2 colonne3 colonne4
do
        grep $colonne1 data.txt | grep $colonne2 | grep $colonne4
done < filtre.txt
$ bash grep.bash
chaine01   chaine02      toto      chaine04.....
chaine05   chaine06      tata      chaine08.....
Mais il va sans dire que le grep est assez léger dans ce cas puisqu'il ne se base pas vraiment sur une "colonne".

Tu peux utiliser awk mais la version simple demande à ce que tu sois certain que telle colonne du filtre corresponde à telle colonne des donnés :
Code :
1
2
3
4
5
6
7
8
9
10
$ cat grep.bash
#!/bin/bash

while IFS=';' read colonne1 colonne2 colonne3 colonne4
do
        awk '$1 =="'$colonne1'" && $2 == "'$colonne2'" && $4 == "'$colonne4'" {print}' data.txt
done < filtre.txt
$ bash grep.bash
chaine01   chaine02      toto      chaine04 ....
chaine05   chaine06      tata      chaine08 ....
Après, tu peux compliqué le traitement awk pour vérifier tous les champs contre toutes les valeurs du filtre à l'aide d'un if par exemple...
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h44   #4
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Est ce que ces chaînes (chaine1, chaine2 ....) peuvent contenir des espaces ?

Non, chaine1,2 c'est en un seul mot.


Quel est le caractère d'espacement de tes colonnes dans le fichier de données (un espace ? une tabulation ? ...)

La 1ère colonne démarre de 1 -> 25
La 2ème colonne démarre de 26 -> 54
La 4ème colonne démarre de 115 -> 151
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h47   #5
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
Qu'est-ce qu'il doit se passer si tu as ceci :
Code :
1
2
3
chaine01   chaine02      toto      chaine04.....
chaine0105 chaine02      tata      chaine04.....
chaine12   chaine10      tata      chaine12......
?
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 14h03   #6
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Qu'est-ce qu'il doit se passer si tu as ceci :
La correspondance doit être exacte. Ce qui revient à dire que la ligne
Code :
chaine0105 chaine02      tata      chaine04.....
ne doit pas être prise car, la première colonne n'est pas chaine01 mais chaine0105
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 14h41   #7
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
En considérant qu'il est possible d'avoir plusieurs occurrences valide et avec AWK :

Code :
1
2
3
4
5
 
DesHaches:~# cat data.txt
chaine01   chaine02      toto      chaine04
chaine05   chaine06      tata      chaine08
chaine12   chaine10      tata      chaine12
Code :
1
2
3
4
5
 
DesHaches:~# cat recherche.txt
chaine01;chaine02;chaine03;chaine04
chaine05;chaine06;chaine07;chaine08
chaine09;chaine10;chaine11;chaine12
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
DesHaches:~# cat chaine.awk
{
  RESULT=1
  while( RESULT == 1 )
     {
         RESULT=getline LIGNEDATA < "recherche.txt"
         split(LIGNEDATA,TABRESULT,";") ;
         if ( TABRESULT[1] == $1  &&  TABRESULT[2] == $2  &&  TABRESULT[4] == $4 )
          {
              print $0
           }
 
     }
close("recherche.txt")
}
Code :
1
2
3
4
 
DesHaches:~# awk -f chaine.awk  data.txt
chaine01   chaine02      toto      chaine04
chaine05   chaine06      tata      chaine08
becket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/05/2011, 17h14   #8
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Merci ça marche
emmachane 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 15h04.


 
 
 
 
Partenaires

Hébergement Web