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 :

Aide pour faire un script sh


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut Aide pour faire un script sh
    Salut à tous et toutes, j'essaye de faire un script bash sous debian et j'avoue ne pas y arriver à cause de mes piètres connaissances (je commence mes 1ers scripts ).

    Je vous explique donc mon idée, j'ai tout un tas de fichiers 1.txt 2.txt 3.txt... qui sont composés de la manière suivante :
    #blablaInnutiles
    #Fri Mar 31 16:38:03 CEST 2006
    Valeur1=xxx
    Valeur2=www
    _valeur3_=ddd.ddd
    Valeur4=
    Valeur5= 02 02 02 02 02
    ...
    Et je voudrait en fait "regrouper" tous ses fichiers en un seul fichier txt (pour exploiter ensuite en csv) dont les valeurs serraient séparée par un signe = (ou autre) et donc former au final un seul fichier qui serai de la forme :
    #blablaInnutiles=#blablaInnutiles2=#blablaInnutiles3
    #Fri Mar 31 16:38:03 CEST 2006=#Fri Mar 31 16:39:03 CEST 2006=#Fri Mar 31 17:38:03 CEST 2006
    Valeur1=xxx=zzz=eee
    Valeur2=www=rrr=ttt
    _valeur3_=ddd.ddd=sfsf=vcbn
    Valeur4==vcnb=nbv
    Valeur5= 02 02 02 02 02=00 00 00=000 00 00

    Est ce que ce genre d'opération est possible ? et surtout si oui comment...

    D'avance merci.

  2. #2
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    Je pense que sa va pas etre facil lol faudrait que tu arrives à parcourir les n fichiers en meme temps ligne par ligne

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Bah oui pour un premier script je veux pas faire ce qu'il y a de plus simple...

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    C'est carrément pas simple, en effet, comme premier script. Tu peux t'en sortir mais avec des gruges. Le truc que je vois, c'est d'imbriquer 2 boucles : 1 boucle d'ensemble pour traiter les fichiers les uns après les autres et une seconde boucle qui lit un fichier ligne à ligne. Par rapport à tout ça, il te faut un compteur pour repérer les lignes que tu traites. Mais attention : je suppose ici que tous les fichiers font exactement le même nombre de ligne et sont ordonnés strictement de la même façon. Il n'y a pas de vérification du style "le paramètre en question est toto, donc je dois compléter la ligne de toto". Si c'est ce que tu cherches parce que les fichiers ne font pas tous le même nombre de lignes ou que les lignes ne sont pas toutes dans le même ordre, faut passer dans un langage plus évolué genre Perl ou PHP qui te permettra plus facilement de jouer avec les tableaux associatifs ou d'autres structures de données du même genre.

    Algo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Pour chaque fichier $fichier
        Si $fichier est le premier fichier de la liste
            initialisation du fichier final avec ce premier fichier
        Sinon
            $compteur = 0
            Pour chaque ligne $ligne de $fichier
                $compteur = $compteur + 1
                concaténation de $ligne à la $compteur-ième ligne du fichier final
            Fin Pour
        Fin Si
    Fin Pour
    En gros, en shell, ça donne ça (j'ai pas testé) :

    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
     
    FICHIER_OUT="fichier.txt"
    FICHIERS_IN="fichier1.txt fichier2.txt fichier3.txt"
     
    PREMIER_FICHIER=1
    for $FICHIER in $FICHIERS_IN
    do
        if [ $PREMIER_FICHIER -eq 1 ]
        then
            cat $FICHIER > $FICHIER_OUT
            PREMIER_FICHIER=0
        else
            $COMPTEUR=0
            cat $FICHIER | while read LIGNE
            do
                $COMPTEUR=$(COMPTEUR+1)
                sed -i ''$COMPTEUR' s/^.*$/&='$LIGNE'/' $FICHIER_OUT
            done
        fi
    done
    Tu peux changer FICHIERS_IN pour mettre un truc du style FICHIERS_IN=`ls *.txt` pour récupérer tous les fichier .txt d'un répertoire (attention à ne pas récupérer le résultat d'une ancienne exécution de script si le fichier de sortie porte aussi l'extension .txt).

    Bon courage

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Merci beaucoup de l'info !
    J'ai essayer ta méthode mais j'y arrive pas

    ./regroupement.sh: line 20: `$FICHIER': not a valid identifier



    J'ai en effet pas du tout l'impression de vouloir faire un truc simple... je vous dirais si je trouve

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Faut virer le $ devant FICHIER dans la boucle for :

    Pareil après le else et dans le do :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        else
            COMPTEUR=0
            cat $FICHIER | while read LIGNE
            do
                COMPTEUR=$(COMPTEUR+1)
                sed -i ''$COMPTEUR' s/^.*$/&='$LIGNE'/' $FICHIER_OUT
            done
        fi
    done
    J'ai pas testé et ça se voit


    Le pb c'est qu'en shell, pour affecter une variable, faut pas mettre de $ devant le nom. Tu mets un $ devant le nom quand c'est pour "utiliser" la variable.

  7. #7
    Membre émérite 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
    Par défaut
    Citation Envoyé par Madmax61
    Et je voudrait en fait "regrouper" tous ses fichiers en un seul fichier txt (pour exploiter ensuite en csv) dont les valeurs serraient séparée par un signe = (ou autre) et donc former au final un seul fichier qui serai de la forme :

    Pourquoi pas "join"


    Fichiers :

    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
     
    Fichier toto01.txt
     
    Valeur1=xxx
    Valeur2=www
    _valeur3_=ddd.ddd
    Valeur4=
    Valeur5= 02 02 02 02 02
     
     
    Fichier toto02.txt
     
    Valeur1=xtoto2
    Valeur2=wtoto2
    _valeur3_=ddd.toto2
    Valeur4= toto2
    Valeur5= 02 02 02 02 02toto2
     
    Fichier toto03.txt
     
    Valeur1=xtoto3
    Valeur2=
    _valeur3_=ddd.toto3
    Valeur4= toto3
    Valeur5= 02 02 02 02 02toto3
     
     
    Fichier toto04.txt
     
    Valeur1=
    Valeur2=wtoto4
    _valeur3_=ddd.toto4
    Valeur4=
    Valeur5= 02 02 02 02 02toto4

    Script utilisant la commande "join" ( join - Fusionner les lignes de deux fichiers ayant un champ commun. )
    http://man.developpez.com/man1/join.1.php

    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
     
    > TmpFile 
    > TravFile
    typeset -i CtrFile=0
    for file in toto??.txt ; do
    	((CtrFile=$CtrFile+1))
    	if [[ $CtrFile -eq 1 ]] ; then
    		echo "* 1er fichier $file"
    		cp $file TravFile
    		continue
    	fi 
    	echo "+ join de $file"
    	join -t"=" TravFile $file > TmpFile
    	mv TmpFile TravFile
    done
    echo "* Resultat dans TravFile"
    cat TravFile

    Résultat :

    Valeur1=xxx=xtoto2=xtoto3=
    Valeur2=www=wtoto2==wtoto4
    _valeur3_=ddd.ddd=ddd.toto2=ddd.toto3=ddd.toto4
    Valeur4== toto2= toto3=
    Valeur5= 02 02 02 02 02= 02 02 02 02 02toto2= 02 02 02 02 02toto3= 02 02 02 02 02toto4

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Ca m'a l'air parfait cela !
    Je doit aller aux 24h00 du mans, je regarde cela à mon retour mardi et vous redit si cela fonctionne.

    D'avance merci.

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    En fait j'ai eu un peu de temps avant le départ et cela fonctionne PARFAITEMENT !!!
    Merci beaucoup BlaireauOne !

    Me reste plus qu'à étudier ton script pour savoir comment il fonctionne

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Bon en fait j'ai encore deux ptit problèmes, si les fichiers sont pas structurés de la même manière cela ne fonctionne plus du tout :

    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
     
    --> more toto1.txt
    #commentaire a la con
    a=ValeurAtoto1
    b=ValeurBtoto1
    c=ValeurCtoto1
    d=ValeurDtoto1
    e=Valeur E toto 1
     
    --> more toto2.txt
    #blabla
    a=ValeurAtoto2
    b=ValeurBtoto2
    c=ValeurCtoto2
    d=ValeurDtoto2
    e=ValeurEtoto2
     
    --> ./join.sh
    * 1er fichier toto1.txt
    + join de toto2.txt
    * Resultats dans resultat.txt
    d=ValeurDtoto1=ValeurDtoto2
    e=Valeur E toto 1=ValeurEtoto2
    Les valeurs des champs a,b, et c ont en effet disparues

    De la même manière si je n'ai pas le bon ordre des valeurs cela ne fonctionne pas non plus :
    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
     
    --> more toto1.txt
    a=ValeurAtoto1
    b=ValeurBtoto1
    c=ValeurCtoto1
    d=ValeurDtoto1
    e=Valeur E toto 1
     
    --> more toto2.txt
    a=ValeurAtoto2
    b=ValeurBtoto2
    d=ValeurDtoto2
    e=ValeurEtoto2
    c=ValeurCtoto2
     
    --> ./join.sh
    * 1er fichier toto1.txt
    + join de toto2.txt
    * Resultats dans resultat.txt
    a=ValeurAtoto1=ValeurAtoto2
    b=ValeurBtoto1=ValeurBtoto2
    d=ValeurDtoto1=ValeurDtoto2
    e=Valeur E toto 1=ValeurEtoto2
    La valeur c à disparut alors qu'elle est présente dans les 2 fichiers...

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    bon en fait pour info j'ai réussis !
    J'ai fait en premier un script qui fait une boucle dans laquelle il analyse tous les fichiers pour en extraire les valeurs une par une et les classer dans le bon ordre, il enregistre ensuite le tout dans un nouveau fichier.
    Pour finir il fait le join sur les nouveaux fichiers et voilà !

    Encore merci de votre aide.

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

Discussions similaires

  1. Besoin d'aide pour faire fonctionner un script Perl pour un photomaton sous Linux.
    Par loran42o dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 29/05/2013, 09h31
  2. Besoin d'aide pour faire fonctionner un Script d'upload d'images
    Par PaoOo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 15/06/2006, 21h24
  3. Besoin d'aide pour faire un script
    Par shinux2004 dans le forum Langage
    Réponses: 4
    Dernier message: 16/07/2005, 16h44
  4. quel langage choisir pour faire de script sous windows
    Par pas05 dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 18/11/2002, 22h42

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