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 :

lire une selection de ligne avec bash


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut lire une selection de ligne avec bash
    Bonjour a tous

    Je souhaite avoir vos lumières pour lire et sortir les données d'un fichier ayant la structure suivante

    1 4
    4466 5062 5600 11398
    2 9
    319 1554 4066 4466 5062 6220 7584 9054 10286
    3 1
    7902
    4 13
    1987 2005 2313 4318 5134 6909 7421 9627 10010 10526 11454 13015 13319
    5 7
    2005 2886 5062 7662 8067 10526 11982
    6 0

    7 5
    2228 5266 6949 8698 11285
    8 6
    1646 3920 4715 5266 8698 11284
    9 0
    ....
    avec un script bash (de préférence).

    J'arrive a sortir _toutes_ les lignes du fichiers avec ce script bash suivant que j'ai trouve sur internet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #! /bin/bash
     
    while read line
    do
         echo -e "$line"
    done < fort.100
    fort.100 est le nom de mon fichier

    Maintenant je souhaiterai le modifier pour qu il me sorte que le contenue des lignes 2, 8, 14, etc.

    Que faut il que je modifie dans le script ci-dessus pour que cela marche ?

    Merci d'avance pour votre aide

  2. #2
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonjour,

    avec la commande awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    awk -v lines=$1 '
    BEGIN {size = split(lines, lineNb, ",")}
    {
      for (i = 1; i <= size; i++)
      {
        if (NR == lineNb[i])
        {
          print
        }
      }
    }' fort.100
    Pour exécuter ce script, il faut lui passer en paramètre les lignes à sortir séparées par des virgules: ./mon_script 2,8,14

    Edit
    : modif code, 2e paramètre au script: le nom du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
     
    awk -v allLines=$1 '
    BEGIN {split(allLines, line, ",")}
    {
      for(i in line) {if(NR == line[i]) {print; next}}
    }' $2
    Appel: ./mon_script 1,4,8 fort.100

  3. #3
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Il suffit de changer la valeur 2 par la ligne voulue.
    Autre possibilité afficher les ligne X à Y.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed-n "2,4p" <fichier"
    affiche les lignes 2 à 4.

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par s_abel Voir le message
    Maintenant je souhaiterai le modifier pour qu il me sorte que le contenue des lignes 2, 8, 14, etc.
    D'où viennent ces numéros de lignes 2, 8 et 14 ?

  5. #5
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Avec awk en ligne de commande et pas en script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # awk -f 'NR == 2 || NR == 8 || NR == 14 {print $0}' fort.100

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    bonsoir,

    Merci pour vos réponses qui marchent. Un petit bémol toutefois, sachant que le fichier fort.100 peut contenir plus de 50000 lignes fait de la même manière (dans l'exemple de mon message, seul une (petite) partie du fichier était donné) un traitement manuel avec comme paramétre le numéro des lignes n'est pas humainement faisable.

    Par conséquent, auriez vous une idée plus générale, ou seul une variable doit être changé, pour que j'ai seulement les données de la ligne

    2, 8, 14,... (jusqu'à la fin du fichier)

    Ce qui me permettrai ainsi de changer facilement la valeur de cette variable pour obtenir les données des lignes

    4, 10, 16, ... (jusqu'à la fin du fichier)

    Merci encore pour votre aide

  7. #7
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Avec la commande seq tu dois pouvoir générer cela. Voici le lien de la man page.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 591
    Points : 19 469
    Points
    19 469
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lignDep="2"
    ecart="6"
    sed -n ''"$lignDep"'~'"$ecart"'p'  fort.100

  9. #9
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lignDep="2"
    ecart="6"
    sed -n ''"$lignDep"'~'"$ecart"'p'  fort.100
    J'aime beaucoup !
    Si je peux me permettre, je rajouterais ceci pour automiatiser le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
     
    lignDep=$1
    ecart=$2
    sed -n ''"$lignDep"'~'"$ecart"'p' $3
    Pour l'exécuter, c'est comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./script.sh 2 6 fort.100

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par s_abel Voir le message
    Par conséquent, auriez vous une idée plus générale, ou seul une variable doit être changé, pour que j'ai seulement les données de la ligne

    2, 8, 14,... (jusqu'à la fin du fichier)

    Ce qui me permettrai ainsi de changer facilement la valeur de cette variable pour obtenir les données des lignes

    4, 10, 16, ... (jusqu'à la fin du fichier)
    Donc si je comprend bien tu veux extraire une ligne sur six, en commençant à un numéro de ligne spécifié dans une variable ? C'aurait été bien de le préciser dès le début, parce qu'en disant simplement "2, 8, 14, ..." c'est un peu dur de comprendre d'où tu sors ces numéros de ligne.

    C'est quand même fou comme la pluspart des gens ici ne savent pas expliquer un problème

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour

    Merci a tous pour vos contributions, je retiens particulièrement celles de N_BaH et de lavazavio qui marchent et qui sont très élégantes et ont pour avantage de me simplifier énormément la vie.

    Merci encore

    a bientôt

  12. #12
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Citation Envoyé par matafan
    C'est quand même fou comme la pluspart des gens ici ne savent pas expliquer un problème
    Comment cela tu n'as pas ta boule de cristal sous la main toi ?

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

Discussions similaires

  1. selection de lignes avec variable
    Par Marys dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/04/2018, 11h12
  2. lire une fichier texte ligne par ligne avec c#
    Par dridi naim dans le forum C#
    Réponses: 2
    Dernier message: 17/02/2011, 21h56
  3. lire une text area ligne par ligne ?
    Par keviin dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2009, 23h48
  4. coment lire une vidéo .mp4 encodée avec du H264!
    Par ase707 dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 21/07/2008, 14h31
  5. Lire une vidéo en C++ avec théora ou bink
    Par Darknicosh dans le forum C++
    Réponses: 2
    Dernier message: 21/11/2006, 16h01

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