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

Mode arborescent

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

+ 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