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 :

Script shell boucle affichage


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut Script shell boucle affichage
    Bonjour à tous,
    J'ai un petit souci que je n'arrive pas à régler avec mon script shell.
    Je possède un fichier qui contient 10 lignes, chaque ligne possède un grand nombre de champs. Pour simplifier.

    Fichier toto.txt :
    ______________________
    |a1 a2 a3 a4 a5 .….... an |
    |b1 b2 b3 b4 b5 ……....bn |
    |c1 c2 c3 c4 c5 …....…cn |
    |………………………………….....|
    |j1 j2 j3 j4 j5 …….……....jn|
    |_____________________|

    Mon but est ainsi de concaténer les numéros de champs des dix lignes pour avoir en sortie dans un nouveau fichier :

    Fichier but.txt
    __________________________
    |a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 |
    |a2 b2 c2 d2 e2 f2 g2 h2 i2 j2 |
    |a3 b3 c3 d3 e3 f3 g3 h3 i3 j3 |
    |…………………………………………..…|
    |an bn cn dn en fn gn hn in jn |
    |_________________________|

    J’arrive à le faire avec une méthode actuelle.

    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
     
    # affiche les premiers éléments de chaque ligne a la suite
     a1=`awk '{ print $1 }' /home/toto.txt`;
    echo –e “\n” $a1 “\n”;
     
    #résultats : a1 b1 c1 d1 e1 f1 g1 h1 i1 j1
     
    # affiche les seconds éléments de chaque ligne a la suite
      a2=`awk '{ print $2 }' /home/toto.txt`;
      echo –e “\n” $a2 “\n”;
     
    #résultats : a2 b2 c2 d2 e2 f2 g2 h2 i2 j2
    Itérer la chose avec un très grand nombre de lignes, cela devient vite inapproprié..

    J’aimerai faire une boucle qui permet directement afficher les éléments comme mon fichier but.txt le montre. Si vous pouviez me donner un coup de pouce s’il vous plait.. J’ai bien abordé le problème avec des for et des while mais l’affichage n’était pas correct.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ((i=0;i<=NF;i++))
    do 
    echo –e “$(awk '{ print $i }' /home/toto.txt)”;
    done > but.txt
    Ce fut sans succès..

    Merci d'avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    en Bash ?
    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
    #!/bin/bash
     
    echo -e "cuu1\nel" | tput -S
    echo -e "Tableau original :\n$(<transposTableau.txt)\n\nTableau transposé:"
     
    # dans un sens...
    ligne=0
    while read line
    do col=0
       for item in $line
       do eval arr${col}[$ligne]="$item"
          ((col++))
       done
      ((ligne++))
    done < transposTableau.txt
     
    # puis dans l'autre :)
    for ((c=0; c<=col; c++)); do
       for ((l=0; l<=ligne; l++)); do eval echo -n "\${arr${c}[l]}\ "; done
       echo
    done | tee but.txt
    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
    Tableau original :
    a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
    b1 b2 b3 b4 b5 b6 b7 b8 b9 b10
    c1 c2 c3 c4 c5 c6 c7 c8 c9 c10
    d1 d2 d3 d4 d5 d6 d7 d8 d9 d10
    e1 e2 e3 e4 e5 e6 e7 e8 e9 e10
    f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
    g1 g2 g3 g4 g5 g6 g7 g8 g9 g10
    h1 h2 h3 h4 h5 h6 h7 h8 h9 h10
    i1 i2 i3 i4 i5 i6 i7 i8 i9 i10
     
    Tableau transposé:
    a1 b1 c1 d1 e1 f1 g1 h1 i1 
    a2 b2 c2 d2 e2 f2 g2 h2 i2 
    a3 b3 c3 d3 e3 f3 g3 h3 i3 
    a4 b4 c4 d4 e4 f4 g4 h4 i4 
    a5 b5 c5 d5 e5 f5 g5 h5 i5 
    a6 b6 c6 d6 e6 f6 g6 h6 i6 
    a7 b7 c7 d7 e7 f7 g7 h7 i7 
    a8 b8 c8 d8 e8 f8 g8 h8 i8 
    a9 b9 c9 d9 e9 f9 g9 h9 i9 
    a10 b10 c10 d10 e10 f10 g10 h10 i10
    pour un tableau de 70x70, en désactivant les affichages, j'ai un real autour de 2s.
    Un script 100% awk fera mieux !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre émérite 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 : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Ce qui me préoccupe ici est que si le fichier est volumineux, il risque très rapidement de saturer la mémoire si on veut le faire en une seule fois. Je propose donc une solution qui acceptera des tableaux de dimensions quelconque, pas obligatoirement carrés, et qui n'utilisera quasiment aucune mémoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    awk '{for (i=1; i <= NF; i++) {printf "%s ", $i >> i ".transpose"}}' $1
    awk '{sub(" $", ""); print}' $(ls -1 *.transpose | sort -n) > final
    rm -f *.transpose

  4. #4
    Membre émérite 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 : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Ciou63, si je corrige ta solution, qui est pas mal elle aussi, ça donne (en bleu les modifs):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    rm -f but.txt
    size=$(awk '{if (max < NF) {max=NF}} END {print max}' toto.txt)
    
    for ((i=1; i <= $size; i++))
    do
      echo $(awk -v i=$i '{print $i}' toto.txt) >> but.txt
    done

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut Script shell boucle affichage
    Merci à vous N_BaH et jmelyn pour vos réponses. Elles sont très interressantes. J'ai choisis la simplicité avec la boucle du troisième poste.
    J'ai maintenant compris pourquoi ma boucle ne marchait pas..

    Autant dire un grand merci à vous!

Discussions similaires

  1. Affichage caractère ASCII dans script Shell
    Par kuja2053 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 31/07/2011, 11h50
  2. afficher les paramètres d'un script shell avec une boucle for
    Par nakatami dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 15/03/2011, 19h21
  3. Script shell, probleme de boucle, permission denied
    Par tibobo_77 dans le forum Linux
    Réponses: 3
    Dernier message: 26/10/2009, 11h36
  4. Explication script shell
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 14/06/2004, 13h54
  5. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24

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