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

Linux Discussion :

[shell script] parser un fichier en colonne


Sujet :

Linux

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 587
    Points : 266
    Points
    266
    Par défaut [shell script] parser un fichier en colonne
    Bonjour,

    Dans un script je parse un fichier texte a plat et affiche sont contenu à l'écran.
    Le problème c'est que tous s'affiche sur une colonne. J'aimerai savoir comment faire afficher sur plusieurs colonnes. Est ce possible?

    Merci.

  2. #2
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par Blo0d4x3
    Bonjour,

    Dans un script je parse un fichier texte a plat et affiche sont contenu à l'écran.
    Le problème c'est que tous s'affiche sur une colonne. J'aimerai savoir comment faire afficher sur plusieurs colonnes. Est ce possible?

    Merci.

    Un extrait du fichier en entrée et de la sortie souhaitée serait un plus

  3. #3
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 587
    Points : 266
    Points
    266
    Par défaut
    ok, voici une partie du fichier en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    script1
    script2
    script3
    ...
     
    script25
    Sur la console le script va m'afficher ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    script1
    script2
    script3
    script4
    ...
    script25
    Moi ce que je voudrais c'est qu'il m'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    script1         script5     script9
    script2         script6     ...
    script3         script7
    script4         script8

  4. #4
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par Blo0d4x3
    ok, voici une partie du fichier en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    script1
    script2
    script3
    ...
     
    script25
    Sur la console le script va m'afficher ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    script1
    script2
    script3
    script4
    ...
    script25
    Moi ce que je voudrais c'est qu'il m'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    script1         script5     script9
    script2         script6     ...
    script3         script7
    script4         script8

    Un script bash qui fait ce que tu veux

    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
     
    declare -a TabLine
    typeset -i NbrRec=0
    typeset -i SizeCol
    typeset Col1=0
    typeset Col2
    typeset Col3
     
    #
    ### Mise en table des enreg. du fichier toto.txt
    ### Nota : l'indice commence à zéro.
    #
    while read line ; do
    	TabLine[$NbrRec]=$line
    	((NbrRec=$NbrRec+1))
    done < toto.txt
     
    ((SizeCol=$NbrRec/3))
    ((modulo=$NbrRec%3))
    [[ $modulo -ne 0 ]] && ((SizeCol=$SizeCol+1))
    ((Col2=$SizeCol))
    ((Col3=$SizeCol*2))
     
    #
    ### Affichage sous forme de 3 colonnes
    #
    while [[ $IndLine -lt $SizeCol ]] ; do
    	printf %-15s\\t%-15s\\t%-15s\\n ${TabLine[$Col1]} ${TabLine[$Col2]} ${TabLine[$Col3]}
    	((IndLine=$IndLine+1))
    	((Col1=$Col1+1))
    	((Col2=$Col2+1))
    	((Col3=$Col3+1))
    done

  5. #5
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 587
    Points : 266
    Points
    266
    Par défaut
    Merci :-).

    J'ai adapter un peu et ca ne marche pas et j'aurai quelque questions

    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
     
    function list()
    {
     
     typeset -i NB_RECORD=0
     typeset -i SIZECOL
     declare -a TabLine
     typeset Col1=0
     typeset Col2
     typeset Col3
     
     printf "$BLUE Liste des scripts disponibles: $NORMAL\n\n"
     
     cat $FICH_REF | egrep "^[^#][^#]*" | while read script over
     do
       TabLine[$NB_RECORD]=$script
       ((NB_RECORD=$NB_RECORD+1))
     
       printf "record: $NB_RECORD\n"
     done
     
     printf "record: $NB_RECORD\n"
     
     ...
    Dans le premier printf "$NB_RECORD" dans le while, la variable s'incrémente bien. Mais une fois sortie du while, la variable $NB_RECORD vaut 0 !
    Et forcement le déroulement du script s'effectue mal a cause de ca.

  6. #6
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par Blo0d4x3
    Merci :-).

    J'ai adapter un peu et ca ne marche pas et j'aurai quelque questions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function list()
    {
        .../...
        typeset -i NB_RECORD=0
        ((NB_RECORD=$NB_RECORD+1))
        .../...
        printf "record: $NB_RECORD\n"
      .../...
    }
     
    printf "record: $NB_RECORD\n"
     ...

    Faire "typeset -i NB_RECORD=0" dans une fonction déclare la variable NB_RECORD locale à la fonction.

    Solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    .../...
    typeset -i NB_RECORD=0
    
    function list()
    {
        .../...
        NB_RECORD=0
        ((NB_RECORD=$NB_RECORD+1))
        .../...
        printf "record: $NB_RECORD\n"
      .../...
    }
    printf "record: $NB_RECORD\n"
    Nota : ce serait sympa de ta part de mettre en ligne ton script d'affichage amélioré

  7. #7
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 587
    Points : 266
    Points
    266
    Par défaut
    J'ai fais comme tu m'a dis mais ca ne change rien:

    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
     
     
    #!/bin/sh
     
    SCRIPTNAME=`basename $0`
    EXIT_SUCCESS=`exit 0`
    EXIT_ERROR=`exit -1`
    VERSION=1.0.0
    FICH_REF="$BIBLIO/scripts"
    typeset -i NB_RECORD=0
     
    function list()
    {
     
     typeset -i SIZECOL
     declare -a TabLine
     typeset Col1=0
     typeset Col2
     typeset Col3
     
     NB_RECORD=0
     
     printf "$BLUE Liste des scripts disponibles: $NORMAL\n\n"
     
     cat $FICH_REF | egrep "^[^#][^#]*" | while read script over
     do
       TabLine[$NB_RECORD]=$script
       ((NB_RECORD=$NB_RECORD+1))
     
       printf "while record: $NB_RECORD\n"
     
     done
     
     printf "record: $NB_RECORD\n"
     
     ((SIZECOL=$NB_RECORD/3))
     ((modulo=$NB_RECORD%3))
     
     [[ $modulo -ne 0 ]] && ((SIZECOL=$SIZECOL+1))
     ((Col2=$SIZECOL))
     ((Col3=$SIZECOL*2))
     
     printf "la\n"
     
     while [[ $IndLine -lt $SIZECOL ]]
     do
     
       printf %-15s\\t%-15s\\t%-15s\\n${TabLine[$Col1]} ${TabLine[$Col2]} ${TabLine[$Col3]}
     
       printf "${TabLine[$Col1]} ${TabLine[$Col2]} ${TabLine[$Col3]}"
       ((IndLine=$IndLine+1))
       ((Col1=$Col1+1))
       ((Col2=$Col2+1))
       ((Col3=$Col3+1))
     
     done
     
     printf "\n"
     
    }
     
    .../...
    Ca me fait en sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ../..
    while record: 36
    while record: 37
    while record: 38
    while record: 39
    while record: 40
    while record: 41
    while record: 42
    while record: 43
    while record: 44
    record: 0
    Je ne comprend pas du tous pouquoi elle revient a 0 sortie du while .
    Pourquoi déclarer NB_RECORD en globale? Je ne m'en sert que dans cette fonction?

  8. #8
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par Blo0d4x3
    J'ai fais comme tu m'a dis mais ca ne change rien:

    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
     
     
    #!/bin/sh
     
    .../...
     cat $FICH_REF | egrep "^[^#][^#]*" | while read script over
     do
       TabLine[$NB_RECORD]=$script
       ((NB_RECORD=$NB_RECORD+1))
     
       printf "while record: $NB_RECORD\n"
     
     done
     
     .../...

    Je ne comprend pas du tous pouquoi elle revient a 0 sortie du while .
    Pourquoi déclarer NB_RECORD en globale? Je ne m'en sert que dans cette fonction?

    Effectivement, l'histoire de la variable locale, ce n'était pas ça
    Tout ce que je peux dire, c'est que le code ci-dessous marche :

    egrep "^[^#][^#]*" $FICH_REF > $$tmp
    while read script
    do
    TabLine[$NB_RECORD]=$script
    ((NB_RECORD=$NB_RECORD+1))
    printf "while record: $NB_RECORD\n"
    done < $$tmp
    rm $$tmp

  9. #9
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 587
    Points : 266
    Points
    266
    Par défaut
    en effet ca marche maintenant. Mais je comprend pas pourquoi avec ma méthode ca ne marchait pas , je vois pas la difference, si quelqu'un peu m"expliquer

    J'ameliore un peu et je poste le tous.

    Merci de ton aide :-)

  10. #10
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 587
    Points : 266
    Points
    266
    Par défaut
    Hello voici le script complet:

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
     
    #!/bin/sh
     
    SCRIPTNAME=`basename $0`
    EXIT_SUCCESS=`exit 0`
    EXIT_ERROR=`exit -1`
    VERSION=1.0.0
    FICH_REF="$BIBLIO/scripts"
     
    #set -x
     
    source $BIBLIO/colors.sh
    source $BIBLIO/fonctions.sh
     
    function list()
    {
     typeset -i NB_RECORD=0
     typeset -i SIZECOL
     declare -a TabLine
     typeset Col1=0
     typeset Col2
     typeset Col3
     
     NB_RECORD=0
     
     printf "$BLUE Liste des scripts disponibles: $NORMAL\n\n"
     
     egrep "^[^#][^#]*" $FICH_REF > $$tmp
     while read script over
     do
      TabLine[$NB_RECORD]=$script
      ((NB_RECORD=$NB_RECORD+1))
      #printf "while record: $NB_RECORD\n"
     done < $$tmp
     rm $$tmp
     
     #cat $FICH_REF | egrep "^[^#][^#]*" | while read script over
     #do
     #  TabLine[$NB_RECORD]=$script
     #  ((NB_RECORD=$NB_RECORD+1))
     
     #  printf "while record: $NB_RECORD\n"
     
     #done
     
     #printf "record: $NB_RECORD\n\n\n"
     
     ((SIZECOL=$NB_RECORD/3))
     ((modulo=$NB_RECORD%3))
     
     [[ $modulo -ne 0 ]] && ((SIZECOL=$SIZECOL+1))
     ((Col2=$SIZECOL))
     ((Col3=$SIZECOL*2))
     
     while [[ $IndLine -lt $SIZECOL ]]
     do
     
       printf %-20s\\t%-20s\\t%-20s\\n `basename ${TabLine[$Col1]}` `basename ${TabLine[$Col2]}` `basename ${TabLine[$Col3]}`
     
       ((IndLine=$IndLine+1))
       ((Col1=$Col1+1))
       ((Col2=$Col2+1))
       ((Col3=$Col3+1))
     
     done
     
     printf "\n"
     
    }
     
    function help_me()
    {
      printf "$SCRIPTNAME:$VERSION Aide: -h pour l'aide, -u pour l'utilisation\n\n"
    }
     
    function usage()
    {
      printf "$SCRIPTNAME:$VERSION Usage: -a installe tous les scripts, -f \$NOMSCRIPT installe le script seul, -l list les scripts disponible.\n\n"
    }
     
    function inst_all()
    {
     
     cat $FICH_REF | egrep "^[^#][^#]*" | while read SCRIPT OWNER GROUP PERM DESPATH
     do
     
      printf "Installation du script `basename $SCRIPT`\n"
     
      cp $SCRIPT $DESPATH >> /dev/null
      chown $OWNER:$GROUP $DESPATH/`basename $SCRIPT` >> /dev/null
      chmod $PERM $DESPATH/`basename $SCRIPT` >> /dev/null
     
     done
     
      if [ $? -ne 0 ]
      then
        printf "Installation [$RED KO $NORMAL]\n"
      else
         printf "Installation [$GREEN OK $NORMAL]\n"
      fi
     
    }
     
    function inst_script()
    {
     
       grep /$1 $FICH_REF | while read SCRIPT OWNER GROUP PERM DESPATH
       do	
     
         printf "Installation du script `basename $SCRIPT`\n"
     
         cp $SCRIPT $DESPATH >> /dev/null
         chown $OWNER:$GROUP $DESPATH/`basename $SCRIPT` >> /dev/null
         chmod $PERM $DESPATH/`basename $SCRIPT` >> /dev/null
     
       done
     
       if [ $? -ne 0 ]
       then
        printf "Installation [$RED KO $NORMAL]\n"
       else
         printf "Installation [$GREEN OK $NORMAL]\n"
       fi
     
    }
     
    clear
     
    printf "$UNDERLINE\t\t\tScript d'installation des scripts perso$NORMAL\n\n"
     
    test_ID_root_and_exit
     
    getopts hualf: options
     
    case $options in
     
      a)
        inst_all
        ;;
     
      l)
        list
        ;;
     
      f)
        inst_script $2
        ;;
     
      h)
         help_me
         ;;
     
       u)
         usage
         ;;
     
       *)
         help_me
         ;;
     
    esac
    Si quelqu'un a des idées d'améliorations elles sont les bienvenues.

  11. #11
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Mars 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2007
    Messages : 199
    Points : 291
    Points
    291
    Par défaut
    Quand tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cat fichier | while read line
    do
      ...
    done
    Tu "fork" (du verbe forker ;-)) un fils qui exécutera la commande while,
    au retour les variables modifiées dans le corps du while
    le sont en faite dans le fils, donc plus rien à la mort de ce dernier.

    Par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while read line 
    do
      [...]
    done < fichier
    fonctionne car dans ce cas tu ne "fork" (tiens encore le verbe forker) pas de fils, tu es toujours dans le même process pére.

  12. #12
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 587
    Points : 266
    Points
    266
    Par défaut
    Ah ok, je pensais à une histoire de descripteurs moi .

    Merci de ces précisions ericduval :-).

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

Discussions similaires

  1. Shell script archivage vieux fichiers .log
    Par LuffyyffuL dans le forum Linux
    Réponses: 2
    Dernier message: 31/12/2011, 13h39
  2. Script shell pour parser un fichier txt
    Par pcsystemd dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/09/2008, 10h32
  3. Traitement de fichier en shell script
    Par sam.fet dans le forum Linux
    Réponses: 3
    Dernier message: 03/05/2006, 15h30
  4. Script shell - écriture dans un fichier
    Par Leishmaniose dans le forum Linux
    Réponses: 6
    Dernier message: 13/12/2004, 23h48
  5. Parser une chaine en shell script
    Par Gogoye dans le forum Linux
    Réponses: 10
    Dernier message: 19/07/2004, 18h49

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