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 :

Problème lorsque retour à la ligne avec grep


Sujet :

Shell et commandes GNU

  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 Problème lorsque retour à la ligne avec grep
    Bonjour,

    J'ai le code bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep 'name="subaffil"' $fic |sed -e 's|^.*class="collapsed">||' |sed ':z;N;$!b z;s/\n/;/g' | sed -e 's|</a></h4></div></div>.*$||' -e 's|<BR>|, |g'
    qui vise à récupérer l'affiliation sur des pages web d'auteurs d'at ideas, telles que :
    https://ideas.repec.org/e/pca127.html

    Exécutée à grande échelle (44000 pages), la majorité des affiliations est bien repérée et enregistrée.

    QUESTION 1 :
    Cependant, je me suis aperçue que cela fonctionne bien lorsque j'ai une page où tout est sur la même ligne, comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blabla <............name="subaffil">blablabla.....class="collapsed"> affiliation,univ,pays</a></h4></div></div>....blabla
    Mais lorsque j'ai sur plusieurs lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    blabla <............name="subaffil">blablabla....class="collapsed"> affiliation
    univ
    pays</a></h4></div></div>....blabla
    il semble alors qu'il s'arrête à la fin de la première ligne et supprime tout le reste.. parce que le résultat est : affiliation
    mais pas univ, ni pays.

    J'ai cherché comment modifier le code, mais je ne sais pas comment arranger ça. Je pense qu'il faudrait mettre une suppression des retours chariots avant de commencer à découper entre class="collapsed"> et </a></h4></div></div>, mais alors il ne pourra plus utiliser le repérage d'une ligne pour savoir quand découper, si ?

    QUESTION 2 :
    De plus, lorsque j'ai 1 ou 2 affiliations, ça fonctionne bien, mais lorsque j'ai 3 ou 4, ca ne fonctionne plus correctement : c'est limité aux 2 premières affiliations. Quelle est l'astuce pour aussi prendre en compte les 3, 4 voire 5eme affiliations ???


    Merci de votre aide,
    cordialement

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Change le premier étage de ta conduite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep 'name="subaffil"' $fic
    En :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/name="subaffil"/{/pays/!{:z;N;/pays/!b z;s/\n/ /g;};p}' $fic

  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
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Change le premier étage de ta conduite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep 'name="subaffil"' $fic
    En :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/name="subaffil"/{/pays/!{:z;N;/pays/!b z;s/\n/ /g;};p}' $fic
    Bonjour,
    en fait, pays est variable. J'ai parfois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div class="panel col-xs-12"><div class="panel-heading"><div class="panel-title"><h4><a name="subaffil" href="#subaffil-body-0" data-toggle="collapse" class="collapsed">Zicklin School of Business<BR>
    Baruch College<BR>
    City University of New York (CUNY)</a></h4></div></div><div class="panel-collapse collapse" id="subaffil-body-0">
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div class="panel col-xs-12"><div class="panel-heading"><div class="panel-title"><h4><a name="subaffil" href="#subaffil-body-0" data-toggle="collapse" class="collapsed">Departement Algemene Economie (Department of Economics)<BR>
    School of Economics and Management<BR>
    Universiteit van Tilburg (Tilburg University)</a></h4></div></div><div class="panel-collapse collapse" id="subaffil-body-0">
    Ce que j'ai appelé "pays" est en fait tout quelque chose qui change à chaque fois...


    Et pour les 3eme, 4eme affiliations, une idée?

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    D'abord, il y a systématiquement plus de balises </div> que de balises <div
    Un fichier bien construit. A moins que je ne m'abuse.

    Ensuite, tu décris mal. Il y a aussi un mot suffisant: 'Location'. Remplace 'pays' par 'Location' dans le script précédent et tu récupères les 4 lignes complètes.

    Enfin, pour les 3ème et 4ème affiliations, je ne comprends pas la question.

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je me permets de proposer une solution basée sur lynx -dump, c'est à dire qui consistera à striper tout le foin html avant de chercher l'info qui nous intéresse, ça me semble peut-être plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ lynx -dump https://ideas.repec.org/e/pca127.html | awk '/^\[[0-9]+\]Affiliation/,/^\[[0-9]+\]Works/' | grep "^\[" | cut -d' ' -f2- | grep -v "^\["
    Unitat de Fonaments de l'Anàlisi Econòmica
    Center for the Study of Organizations and Decisions in Economics
    Consorci Markets, Organizations and Votes in Economics (MOVE)
    Universitat Autonoma de Barcelona. Unitat de Fonaments de l'Analisi
    c'est sûrement perfectible

  6. #6
    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
    En effet, avec Location le problème est résolu, merci beaucoup.


    Je m'excuse, l'erreur ne vient pas de la commande, mais de la suivante que j'ai élaboré, et qui ne s'adapte pas pour 3 ou plus. J'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F';'  '{if ( /[0-9][0-9]*%/ ) print $1";"$2";"$3"\n"$1";"$2";"$4; else print $0} ' ./affiliatio.csv  > affiliation.csv
    Je viens d'adapter en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F';'  '{if ( /[0-9][0-9]*%/ ) print $1";"$2";"$3"\n"$1";"$2";"$4"\n"$1";"$2";"$5"\n"$1";"$2";"$6"\n"$1";"$2";"$7"\n"$1";"$2";"$8"\n"$1";"$2";"$9"\n"$1";"$2";"$10; else print $0} ' ./affiliatio.csv  > affiliation.csv
    Ce problème n'en est plus un.
    Merci.

    Par ailleurs, parfois j'ai plusieurs institutions sans avoir de pourcentage d'affiliation. Comment puis-je faire pour "compter" le nombre d'institutions, et diviser 100 par le nombre, pour l'affecter à la ligne ?
    j'ai par exemple
    paa1;nom1;instit1;
    paa1;nom1;instit2;
    paa1;nom1;instit3;

    et je voudrais :
    paa1;nom1;instit1;33
    paa1;nom1;instit2;33
    paa1;nom1;instit3;33

    ou encore
    paa1;nom1;instit1;
    paa1;nom1;instit2;


    je voudrais :
    paa1;nom1;instit1;50
    paa1;nom1;instit2;50

  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 BufferBob Voir le message
    salut,

    je me permets de proposer une solution basée sur lynx -dump, c'est à dire qui consistera à striper tout le foin html avant de chercher l'info qui nous intéresse, ça me semble peut-être plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ lynx -dump https://ideas.repec.org/e/pca127.html | awk '/^\[[0-9]+\]Affiliation/,/^\[[0-9]+\]Works/' | grep "^\[" | cut -d' ' -f2- | grep -v "^\["
    Unitat de Fonaments de l'Anàlisi Econòmica
    Center for the Study of Organizations and Decisions in Economics
    Consorci Markets, Organizations and Votes in Economics (MOVE)
    Universitat Autonoma de Barcelona. Unitat de Fonaments de l'Analisi
    c'est sûrement perfectible
    Bonjour,
    J'essaie, je suis en train d'installer lynx, je n'avais pas cette commande. Je vous dis si ça marche. Merci

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Une inspiration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat trout.txt
    paa1;nom1;instit1;
    paa1;nom1;instit2;
    paa1;nom1;instit3;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat trout2.txt
    paa1;nom1;instit1;
    paa1;nom1;instit2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk -F';' '{a[$1$2]++;b[$0]=$1$2;} END{for (i in b) print i""int(100/a[b[i]]);}' trout.txt
    paa1;nom1;instit1;33
    paa1;nom1;instit2;33
    paa1;nom1;instit3;33
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk -F';' '{a[$1$2]++;b[$0]=$1$2;} END{for (i in b) print i""int(100/a[b[i]]);}' trout2.txt
    paa1;nom1;instit1;50
    paa1;nom1;instit2;50

  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
    Bonjour,
    sachant que l'on a plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat trout.txt
    paa1;nom1;instit1;
    paa1;nom1;instit2;
    paa1;nom1;instit3;
    paa2;nom2;instit1;80
    paa2:nom2;instit2;20
    Comment puis-je ignorer les lignes ayant déjà un %age ?

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F';' '!/^.*%.*$/ {a[$1$2]++;b[$0]=$1$2;} END{if ($4=="") for (i in b) print i""int(100/a[b[i]]);}' affiliation_essai.csv > affiliation_e.csv
    mais c'est comme s'il ne tenait pas compte de ma condition
    Merci !

  10. #10
    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 résolu le problème en distinguant dans 2 fichiers différents les lignes avec et sans %age, puis en les concaténant une fois l'opération faite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    grep -v '^.*;[0-9][0-9]*$' affiliation_essai.csv | awk -F';' '{a[$1$2]++;b[$0]=$1$2;} END{ for (i in b) print i""int(100/a[b[i]]);}' > affiliation_e.csv
    grep '^.*;[0-9][0-9]*$' affiliation_essai.csv > affiliation_f.csv
    cat affiliation_[a-z].csv > affiliation_fin.csv

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/06/2015, 15h55
  2. problème de retour à la ligne
    Par frol dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 02/12/2006, 14h35
  3. Problème de retour à la ligne
    Par AurelBUD dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 30/05/2006, 15h17
  4. Problème retour à la ligne avec textarea
    Par finalfx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/05/2006, 18h59
  5. [MySQL] problème de retour à la ligne.
    Par NPortmann dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/09/2005, 14h43

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