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 :

Tableau multidimensionnel -> création et parcours


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut Tableau multidimensionnel -> création et parcours
    Bonjour,

    J'ai 2 fichiers.
    Je voudrais stocker mes valeurs dans un tableau multidimensionnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier 1
    item1 2 8
    item2 3 6
    tab[ligne1][colonne1]= 2
    tab[ligne1][colonne2]= 8
    tab[ligne2][colonne1]= 3
    tab[ligne2][colonne2]= 6

    fichier 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >reference
    catgtgcgtctatgcatgcagt
    Je voudrais stocker également ces deux valeurs dans un tableau.
    tab2[refernce]=catgtgcgtctatgcatgcagt


    Pour enfin parcourir mes 2 tableaux et extraire l'information qui m'interesse.
    parcourir tab
    parcourir tab2

    Merci par avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    awk fait ça très bien, "nativement".
    cf. GNU Awk Manual User's Guide
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Merci de votre réponse.


    J'ai lu lelien mais je n'arrive toujours pas à comprendre!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while read nom deb fin
    do
    echo "$nomseq" "$start" "$stop"
     
    declare -A tableau
     
       tableau[lin_1,col_1]=$nomseq
       tableau[lin_2,col_2]=$start
       tableau[lin_3,col_3]=$stop
     
    done < fichier1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while read nom sequence
    do
    echo $nom
    echo $sequence
    tabl[$nom]=[$sequence]
    done <fihcier2

    #parcours des 2 fichiers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i in "tableau[@]"
    do
    echo "ligne: $l ; colonne:$tableau["$l","$c"]"";
    done
    for (name in tabl) {
           print "Nom : " name " | Home : " tabl[name]
    }
    #calcul
    Je n'arrive pas à afficher tous les éléments de mon tableau

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Attention, tu mélanges les syntaxes bash et awk; ça va pas le faire !

    à ta place, je ferais tout en awk, ça risque de vite tourner à l'usine à gaz en bash !
    les tableaux associatifs sont hashés, ils ne seront pas affichés dans l'ordre.
    il existe en gawk des fonctions de tri des tableaux, qui permettront de les restituer dans un ordre donné, pas en bash.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Je ne comprends pas ce qui ne va pas dans mon script!
    je ne comprends pas comment construire un tableau multidimensionnel avec cette histoire SUBSEP is "@"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BEGIN{FS="\t"}
     {
    for (i=1;i<NF;i++)
    tab[$1,$2]=$3
    }
    END {
    #affichage
    for (x = 1; x <= NF; x++) 
    {for (y = NR; y <= 1; y++)
                   print (tab[x, y])
              print("\n")
         }
    }

    #fichier 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN{FS="\t"}
    {
    for (i=1;i<NF;i++) 
    tab2[$1]=$2
    }
    END {
        for (mot in tab2)
                print  mot, tab2[mot]
    }

    je ne demande pas la réponse mais si vous pouviez m'expliquer car j'ai beau lire mais je ne pense pas avoir compris

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    t'étais pas loin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat fichier1 
    item1 2 8
    item2 3 6
    en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk '{for (i=1;i<=NF;i++){ar[NR][++c]=$i}};END{for(i in ar){for(y in ar[i])printf("%s\t",ar[i][y]); print ""}}' fichier1 
    item1   2       8
    item2   3       6
    le deuxième fichier peut être traité en bash (sauf l'ordre).
    mais les deux tableaux n'existant pas dans le même contexte ne pourront interagir l'un avec l'autre.

    ça vaudrait le coup que, en situation, tu nous montres ce que tu veux faire.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    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

    Je surligne:
    Quel est le vrai but final ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Merci et c'est plus clair pour moi aussi


    Je veux à partir des positions contenu dans mon fichier 1,
    extraire l'information contenu dans mon fichier 2

    Au final je veux avoir pour final.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #item1
    lelionestmortcesoir
    #item2
    ouijenesiasquefaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BEGIN{FS="\t";}
    {
    { print $2,$3,$1} # juste pour vérification
    { if($0 ~/^>/) print $0; else{print substr($0,$2,$3) "fichier2.txt" }} > "final.txt"
    }
    Ce que je ne sais pas faire c'est comment indiquer mon fichier2.txt dans mon script pour qu'il soit pris en compte!!

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN{FS="\t";}
    {
    { print $2,$3,$1} # juste pour vérification
    getline < "fichier2.txt"
    { if($0 ~/^>/) print $0; else{print substr($0,$2,$3) }} 
    }
    getline me permet de traiter le fichier2.txt mais ne prend pas en compte ce qui est dans le else!
    Je bloque

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    mais il sort d'où ce lion ?

    on a le fichier de sortie...
    on veut aussi les fichiers en entrée !
    ET une explication des transformations effectuées.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Désolé

    fichier1.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    item1 14 19
    item2 33 20
    fichier2.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ytyzgvhzcvghdlelionestmortcesoirjuhnciauhckjndvjskcnouijenesiasquefairegtygavczhsx

    final.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #item1
    lelionestmortcesoir
    #item2
    ouijenesiasquefaire

    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
    BEGIN{FS="\t"; OFS="\n"}  
    {
    	for (i=1;i<=NF;i++)
    	{
    		ar[NR][++c]=$i
    	}
    };
    END{
    for(i in ar)
    	{
    		for(y in ar[i])
    		printf("%s\t",ar[i][y]); print ""
     
    		getline < "fichier2.txt"
    		info=substr($0,ar[i][2],ar[i][3])  #il faut qu'il prenne le $0 du fichier2.txt!
                    print ">"ar[i][1],$info
    	}
    }

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    ton raisonnement est erroné.

    je te propose une solution, qui ne fonctionne pas complètement parce que les références fournies sont fausses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat fichier1
    item1 14 19
    item2 33 20
    $ cat fichier2
    ytyzgvhzcvghdlelionestmortcesoirjuhnciauhckjndvjskcnouijenesiasquefairegtygavczhsx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk 'FNR==NR{bornes[$1]=$2","$3;next}{for(i in bornes){split(bornes[i],a,","); print i"\n"substr($0,a[1],a[2])}}' fichier1 fichier2
    item1
    lelionestmortcesoir
    item2
    juhnciauhckjndvjskcn
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    Voici le script corrigé (par contre ton fichier1.txt pour le deuxieme item n'est pas bon) :
    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
    FNR == NR {
            for (i=1;i<=NF;i++)
            {
                    ar[NR][i]=$i
            }
            next
    };
    {for(i in ar)
            {
                    for(y in ar[i])
                    printf("%s\t",ar[i][y]); print ""
     
                    info=substr($0,ar[i][2],ar[i][3])  #il faut qu'il prenne le $0 du fichier2.txt!
                    print ">"ar[i][1],info
            }
    }
    et celui-ci s'execute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk -f script.awk fichier1.txt fichier2.txt
    item1   14      19
    >item1 lelionestmortcesoir
    item2   33      20
    >item2 juhnciauhckjndvjskcn

  14. #14
    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
    Autre façon de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk 'FNR==NR{debut[$1]=$2;long[$1]=$3;next;} {for (i in debut) {print "#"i; print substr($0,debut[i],long[i]);} }' fichier1 fichier2
    #item1
    lelionestmortcesoir
    #item2
    juhnciauhckjndvjskcn

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Par défaut
    Merci @N_BaH, @disedorgue et @Flodelarab

    Oui mes références sont fausses N_BaH (item2 53 19)

    J'ai une question
    Pourquoi mettre FNR==NR ; je ne vois pas bien à quoi cela correspond. Mes 2 fichiers ont un nombre de lignes différentes

  16. #16
    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
    Tu as 2 fichiers en entrée. Mais tu pourrais en avoir 36.
    Le premier fichier ne subit pas le même traitement que les suivants.
    Donc pour le premier FNR==NR; alors que pour les autres non.

    Et le mot clé "next" empêche le deuxième bloc de s'exécuter pour le premier fichier.

    En conclusion, le premier fichier subit le premier bloc d'instruction et les autres fichiers, le second bloc d'instructions. C'est une "astuce" classique pour awk.

  17. #17
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Juste pour le fun, via bash avec tableau associatif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ unset items ordres
    $ declare -A items ; declare -a ordres
    $ while read x y z; do items["$x"]="$y $z" ; ordres+=( "$x" ); done <fichier1.txt
    $ while read; do for i in "${!ordres[@]}"; do read A B <<<"${items[${ordres[$i]}]}" ; echo -e "${ordres[$i]}\n${REPLY:A-1:B}"; done; done <fichier2.txt
    item1
    lelionestmortcesoir
    item2
    juhnciauhckjndvjskcn

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Pourquoi mettre FNR==NR ; je ne vois pas bien à quoi cela correspond. Mes 2 fichiers ont un nombre de lignes différentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk 'BEGIN{print "FNR NR FILENAME"}{print FNR,NR,FILENAME}' ./fichier1 ./fichier2
    FNR NR FILENAME
    1 1 ./fichier1
    2 2 ./fichier1
    1 3 ./fichier2
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. [PHP 5.4] Tableaux multidimensionnels : création et parcours
    Par akkyshan dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2012, 09h49
  2. Réponses: 2
    Dernier message: 27/11/2005, 23h36
  3. Nombre de dimensions d'un tableau multidimensionnel
    Par Bruno75 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/07/2005, 10h03
  4. type de donnée tableau multidimensionnel
    Par opheliegomes dans le forum Débuter
    Réponses: 2
    Dernier message: 03/02/2005, 12h29
  5. [langage] tableau multidimensionnel
    Par totox17 dans le forum Langage
    Réponses: 3
    Dernier message: 03/12/2002, 15h58

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