IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Erreur de comptage programme bash


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2015
    Messages : 32
    Par défaut Erreur de comptage programme bash
    Bonjour,
    après 3 jours de recherches intensives, je ne trouve pas la solution de mon problème. J'ai un fichier .sh que j'exécute sur des fichiers .html. Ce premier recherche le nombre d'articles (écrits par des chercheurs) situés sur la page téléchargée en html. Chaque article est listé en commençant <LI>. Seulement, dans cette liste, il y a des sous-listes marquées par <UL> et </UL> au début et à la fin. Ma boucle qui doit les détecter repère bien les débuts de sous-liste, mais pas les fins. C'est comme si elle réinitialisait la valeur de la variable d'entrée dans une sous-liste.
    Si qqn sait quel est le problème dans ma boucle, ça me serait d'une extrême aide !

    Pour faire tourner ce fichier .sh sur le .html, j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd /Users/nanana/Desktop/essai
    for u in `cat liste_url_short.txt`; do nomfic=`echo $u | awk -F '/' '{print $5}'`; wget $u;  ./analyse_wp2_copie.sh $nomfic; done >publis_short.csv
    et le fichier qui sera créé s'appellera publis_short.csv
    Le problème, c'est qu'en allant sur la page web https://ideas.repec.org/e/paa6.html on voit bien que ce chercheur n'a publié que 34 articles. Le programme en compte 54. En fait, il ne compte pas le premier des sous-listes, mais il compte (à tort) les suivants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!/bin/bash
    # principe :
    # les articles commencent par <A NAME=articles><HR><H4>Articles<\/H4><OL>
    # et se terminent par </OL>
    # entre les 2 lignes, on compte les <LI>, mais il faut éliminer 
    # les liste intermédiaires (uniquement des UL ?)
     
    # une ligne peut contenir 2 balises parmi les balises recherchées
     
    fic=$1
     
    nbart=0
    nbchp=0
    nbbk=0
    nbsft=0
    in_art=''
    # in_art = 1 si on est dans le bloc Articles
    in_chp=''
    in_bk=''
    in_sft=''
    # in_liste_art = 1 si on est dans une sous liste article <UL> ....</UL>
    in_liste_art=''
    in_liste_chp=''
    in_liste_bk=''
    in_liste_sft=''
     
    auteur=`grep '<TITLE>' $fic |sed -e 's| <TITLE>||' -e 's| at IDEAS</TITLE>||'`
    idauteur=${fic%.*l}
     
    while read line
    do
    # articles
      if [ "$in_art" != "1" ]
      then
          in_art=`echo $line | awk '/id="articles-body"><ol>/ {print "1"}'`
     
      else  
          in_liste_art=`echo $line | awk '/<UL>/ {print "1"}'`
          end_art=`echo $line | awk '/<\/ol><\/div><\/div>/ {print "1"}'`
    	if [ "$end_art" != "1" ]
        then
    	 	if [ "$in_liste_art" = "1" ]
    	 	then
    	    end_liste=`echo $line | awk '/<\/UL>/ ~ $0 && /.*<UL>.*/ !~ $0 {print "1"}'`
    	     	if [ "$end_liste" = "1" ]
    	     	then		 
    		 	in_liste_art=''	 	 	
                fi
    	 	fi
    	 	if [ "$in_liste_art" != "1" ]
    	 	then
    	    li_art=`echo $line | awk '/<LI class="downgate">/ || /<LI class="downnone">/ || /<LI class="downfree">/ {print "1"}'`
    	     	if [ "$li_art" = "1" ]
    	     	then
    		 	nbart=`expr $nbart + 1`
    	     	fi	  
    	  	in_liste_art=`echo $line | awk '/<UL>/ {print "1"}'`
    	  	fi
        else
    	in_art=''
    	fi
      fi
     
     
      done < $fic
     
    echo "$idauteur;$auteur;$nbart;$nbbk;$nbchp;$nbsft"

    Merci beaucoup !
    Cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    et si tu pré-traitais le fichier avec sed pour éliminer les lignes entre <UL> et </UL> ?

    il y a trop de commandes externes pour faire ce que peut faire bash avec l'opérateur =~ entre [[ .. ]], et éventuellement avec le tableau BASH_REMATCH.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2015
    Messages : 32
    Par défaut
    Bonjour,

    Merci, je vais essayer de faire ça, c'est une très bonne idée.
    Je vous dis si ça fonctionne.

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2015
    Messages : 32
    Par défaut
    Bonjour,

    Je ne sais pas si c'est possible. En fait il faudrait faire un
    sed -i '/depuis la ligne contenant <UL> jusqu'à celle avec </UL>/d' monfichier.html

    Mais du coup je pense que ce n'est pas possible. Mon fichier a la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <div class="publishedas"><UL><LI class="downgate"> Dagsvik, John K. & Wennemo, Tom & Wetterwald, Dag G. & Aaberge, Rolf, 2002.
    "<B><A HREF="https://ideas.repec.org/a/eee/transb/v36y2002i4p361-384.html">Potential demand for alternative fuel vehicles</A></B>,"
    <A HREF="https://ideas.repec.org/s/eee/transb.html">Transportation Research Part B: Methodological</A>,
    Elsevier, vol. 36(4), pages 361-384, May.
     
    </UL></div><LI class="downfree">Rolf Aaberge, 1995.
     "<B><A HREF="/p/ssb/dispap/158.html">Choosing Measures of Inequality for Empirical Applications</A></B>,"
    <A HREF="/s/ssb/dispap.html">Discussion Papers</A> 
    158, Research Department of Statistics Norway.
     
    <LI class="downfree">Dagsvik, John & Aaberge, Rolf, 1990.
     "<B><A HREF="/p/wbk/wbrwps/503.html">Household production, time allocation, and welfare in Peru</A></B>,"
    <A HREF="/s/wbk/wbrwps.html">Policy Research Working Paper Series</A> 
    503, The World Bank.
     
    <LI class="downnone">John E. Roemer & Rolf Aaberge & Ugo Colombino & Johan Fritzell & Stephen P. Jenkins & Ive Marx & Marianne Page & Evert Pommer & Javier Ruiz-Castillo & Maria Jesus San Segundo & Torben Tranæs & Gert G.,   .
     "<B><A HREF="/p/kud/epruwp/00-10.html">To What Extent Do Fiscal Regimes Equalize Opportunities for Income Acquisition among Citizens?</A></B>,"
    <A HREF="/s/kud/epruwp.html">EPRU Working Paper Series</A> 
    00-10, Economic Policy Research Unit (EPRU), University of Copenhagen. Department of Economics.
     
    <div class="publishedas"><UL><LI class="downgate"> Roemer, John E. & Aaberge, Rolf & Colombino, Ugo & Fritzell, Johan & Jenkins, Stephen P. & Lefranc, Arnaud & Marx, Ive & Page, Marianne & Pommer, Evert & Ruiz-Castillo, Javier, 2003.
    "<B><A HREF="https://ideas.repec.org/a/eee/pubeco/v87y2003i3-4p539-565.html">To what extent do fiscal regimes equalize opportunities for income acquisition among citizens?</A></B>,"
    <A HREF="https://ideas.repec.org/s/eee/pubeco.html">Journal of Public Economics</A>,
    Elsevier, vol. 87(3-4), pages 539-565, March.
     
    </UL></div><div class="otherversion"><UL><LI class="downfree">John E. Roemer & Rolf Aaberge & Ugo Colombino & Johan Fritzell & Stephen P. Jenkins & Ive Marx & Marianne Page & Evert Pommer & Javier Ruiz-Castillo & Maria Jesus SanSegundo & Torben Tranaes & Gert G., 2000.
     "<B><A HREF="https://ideas.repec.org/p/ssb/dispap/272.html">To what Extent do Fiscal Regimes Equalize Opportunities for Income Acquisition Among citizens?</A></B>,"
    <A HREF="https://ideas.repec.org/s/ssb/dispap.html">Discussion Papers</A> 
    272, Research Department of Statistics Norway.
     
    <LI class="downfree">John Roemer, 2003.
     "<B><A HREF="https://ideas.repec.org/p/cda/wpaper/00-3.html">To What Extent Do Fiscal Regimes Equalize Opportunities For Income Acquisition Among Citizens</A></B>,"
    <A HREF="https://ideas.repec.org/s/cda/wpaper.html">Working Papers</A> 
    03, University of California, Davis, Department of Economics.
     
    <LI class="downfree">John E. Roemer,   .
     "<B><A HREF="https://ideas.repec.org/p/fth/caldec/00-03.html">To What Extent Do Fiscal Regimes Equalize Opportunities For Income Acquisition Among Citizens</A></B>,"
    <A HREF="https://ideas.repec.org/s/fth/caldec.html">Department of Economics</A> 
    00-03, California Davis - Department of Economics.
     
    <LI class="downfree">John E. Roemer & Rolf Aaberge & Ugo Colombino & Johan Fritzell & Stephen P. Jenkins & Ive Marx & Marianne Page & Evert Pommer & Javier Ruiz-Castillo & Maria Jesus San Segundo & Torben Tranaes & Gert G, 2000.
     "<B><A HREF="https://ideas.repec.org/p/diw/diwwpp/dp222.html">To What Extent do Fiscal Regimes Equalize Opportunities for Income Acquisition Among Citizens?</A></B>,"
    <A HREF="https://ideas.repec.org/s/diw/diwwpp.html">Discussion Papers of DIW Berlin</A> 
    222, DIW Berlin, German Institute for Economic Research.
     
    </UL></div></ol></div></div>
    et pour la ligne contenant les deux, ca fonctionnera pas correctement, ça supprimera la ligne en lisant </UL> et du coup le <UL> déjà sur cette ligne sera supprimé...

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2015
    Messages : 32
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    et si tu pré-traitais le fichier avec sed pour éliminer les lignes entre <UL> et </UL> ?

    il y a trop de commandes externes pour faire ce que peut faire bash avec l'opérateur =~ entre [[ .. ]], et éventuellement avec le tableau BASH_REMATCH.
    J'ai essayé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for u in `cat liste_url_short.txt`
    do nomfic=`echo $u 
    awk -F '/' '{print $5}'`
     wget $u
     while read line
    do 
    [[ "$line" =~"<UL>(.*)<\/UL>" ]] 
    done < $u 
    ./analyse_wp2_copie.sh $nomfic
    done >publis_short.csv
    mais j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MacBook-Pro-de-xxxx:
     for u in `cat liste_url_short.txt`
    > do nomfic=`echo $u 
    > awk -F '/' '{print $5}'`
    >  wget $u
    >  while read line
    > do 
    > [[ "$line" =~"<UL>(.*)<\/UL>" ]] 
    -bash: conditional binary operator expected
    -bash: syntax error near `=~"<UL>(.*)<\/UL>"'
    MacBook-Pro-de-Elodie:essai elodie$ done < $u 
    -bash: syntax error near unexpected token `done'

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    il manque un espace après l'opérateur.

    si les marques html sont sur la même ligne, ça ne fonctionnera pas davantage avec bash !
    le pré-traitement doit donc consister à mettre à la ligne chaque marque html.

    et, on ne lit pas un fichier avec une boucle for !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2015
    Messages : 32
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    il manque un espace après l'opérateur.

    si les marques html sont sur la même ligne, ça ne fonctionnera pas davantage avec bash !
    le pré-traitement doit donc consister à mettre à la ligne chaque marque html.

    et, on ne lit pas un fichier avec une boucle for !
    Si je comprends bien, en ayant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    abcde<UL>fghij</UL>klmno
    le code retourne
    mais si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    abcde
    <UL>fghi
    jklmn
    </UL>opqr
    ca fonctionnera pas : ca retournera :
    au lieu de

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    à partir de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abcde<UL>fghij</UL>klmno
    tu dois chercher à obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    abcde
    <UL>fghij
    </UL>klmno
    de façon à ce que les balises ouvrantes et fermantes ne soient pas sur la même ligne.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2015
    Messages : 32
    Par défaut
    J'ai x liens html dont j'extrait la page avec la boucle for, et à l'intérieur de cette boucle, lorsque je suis sur le fichier u, j'ai mis un while read line ; do ... ; done < $u. Ca ne convient pas ?

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Le pipe | prend la sortie d'une commande pour la mettre à l'entrée de la commande suivante. Il ne faut donc pas redonner une cible (fichier).
    En relisant, je me rends compte que j'ai fait la même erreur en copiant/collant.

    Soit on télécharge et on traite à la volée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wget -O- https://ideas.repec.org/e/paa6.html | sed -n '/<OL>/{:z;N;s@<UL>.*</UL>@@;/<\/OL>/!b z;p}' |sed '/<LI>/!d'
    Soit on traite un fichier déjà téléchargé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/<OL>/{:z;N;s@<UL>.*</UL>@@;/<\/OL>/!b z;p}' /tmp/test.htm |sed '/<LI>/!d'
    Et vous constaterez 35 lignes.

    Vous avez échappé le / de OL mais pas celui de UL, le 35 peut venir de là?
    Le séparateur pour la substitution n'est pas fixe. On peut en utiliser d'autres (je n'ai pas la liste sous la main). Or, nous savons que c'est un fichier html. Donc rempli de /. Ainsi, je remplace le séparateur pour la substitution / par @ et je n'ai plus besoin d'échapper sans cesse.
    Par contre, pour désigner les expressions régulières, j'ai oublié si d'autres signes sont possibles. L'échappement est donc de rigueur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur dans un programme php pour une connexion à une bdd
    Par gaetan.tranvouez dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/06/2006, 21h06
  2. [Debutant][XSL] Erreur de code programmation
    Par SkyDev dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/03/2006, 22h38
  3. Programmation bash sous windows?
    Par sali dans le forum Linux
    Réponses: 2
    Dernier message: 07/12/2005, 19h18
  4. Comptage avec bash
    Par ALT dans le forum Linux
    Réponses: 8
    Dernier message: 20/10/2004, 11h02
  5. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo