Forum Linux.débutant Extraire et agencer tableau de fichier texte

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
19
déc.
2016

Bonjour,

j'ai un fichier texte qui se présente ainsi:

Layer 1
A B C D E
1 2 4 8 5
2 4 5 4 1
4 2 6 3 5
3 7 8 4 3
. . . . .
. . . . .
. . . . .
2 5 4 2 3
Layer 2
A B C D E
1 2 1 9 5
2 1 4 1 1
1 2 6 3 4
3 7 8 1 3
. . . . .
. . . . .
. . . . .
2 4 1 2 3
Layer 3
A B C D E
2 2 4 8 5
2 1 5 1 2
1 2 6 3 5
3 7 8 1 3
. . . . .
. . . . .
. . . . .
2 5 1 2 3

Et j'aimerais obtenir la sortie suivante:

Layer 1 Layer 2 Layer 3
A B C D E A B C D E A B C D E
1 2 4 8 5 1 2 1 9 5 2 2 4 8 5
2 4 5 4 1 2 1 4 1 1 2 1 5 1 2
4 2 6 3 5 1 2 6 3 4 1 2 6 3 5
3 7 8 4 3 3 7 8 1 3 3 7 8 1 3
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
2 5 4 2 3 2 4 1 2 3 2 5 1 2 3

Quel serait la façon la plus simple et pérenne d'effectuer cela selon, s'il vous plait ?

  • # Coucou

    Posté par  . Évalué à 7.

    Pas tout à fait ce que tu cherches mais ça t’aidera peut-être :

    stef@medusa:~$ cat t1
    8 9 6
    -2 3 5
    9 4 2
    stef@medusa:~$ cat t2
    1 8 9
    5 -6 3
    7 7 8
    
    stef@medusa:~$ paste -d' ' t1 t2
    8 9 6 1 8 9
    -2 3 5 5 -6 3
    9 4 2 7 7 8
    
    stef@medusa:~$
    

    Donc si tu peux découper ton fichier de départ tu devrais pouvoir ensuite le « recoller » ainsi…

  • # Facile en pseudo code

    Posté par  (site web personnel) . Évalué à 0.

    faire
      pour i allant de 1 à 3
      lire ligne i ; ecrire ligne i;
      fin pour
    retour à la ligne
    tant que fin de fichier non atteinte
    

    Système - Réseau - Sécurité Open Source - Ouvert à de nouvelles opportunités

  • # technique la rache

    Posté par  . Évalué à 3.

    pour chaque layer
     compter nombre de ligne
     calculer maxligne(layer1lignes,layer2ligne...)
    finpour
    
    
    
    pour la ligne N entre 1 et maxligne calculé plus tot
     pour chaque layer
      lire ligne N
      si ligne N existe,
      alors 
        ecrire ligne N dans fichier de sortie, sans retour à la ligne
      sinon
        ecrire ...
      fisi
     finpour
    finpour
  • # commentaire supprimé

    Posté par  . Évalué à 2. Dernière modification le 19 décembre 2016 à 22:46.

    Commentaire supprimé par moi-même, pas lu attentivement le commentaire de Marotte :)

  • # Matrices

    Posté par  . Évalué à 1.

    Une commande pour manipuler des matrices, ça n'irait pas ?

  • # Y'a un outil pour ça

    Posté par  . Évalué à 3.

    Vite fait comme ça, je dirais bien d'aller voir la commande paste : http://pwet.fr/man/linux/commandes/paste

  • # Certainement pas la plus simple...

    Posté par  . Évalué à 2.

    mais je me suis bien amusé :
    (les données sont dans fichier.txt)

    #!/bin/bash
    
    a=$(grep -n "Layer 1" fichier.txt |cut -d":" -f1)   # numéro ligne 1er Layer
    b=$(grep -n "Layer 2" fichier.txt |cut -d":" -f1)   # numéro ligne 2ème Layer
    d=$((b-a))                                          # différence -> nbre de ligne à traiter 
    
    for i in $(seq $d); do                              # de 1 à nombre de lignes
      ligne=$i
      for j in $(seq 3); do                             # on boucle 3 fois (3 Layers - modifiable)
        echo -n $(sed -n "$ligne p" < fichier.txt) " "  # affichage sans retour à la ligne
        ligne=$((ligne+d))                              # ligne correspondante dans le Layer suivant
      done
      echo ""                                           # retour à la ligne
    done
    • [^] # Re: Certainement pas la plus simple...

      Posté par  . Évalué à 2.

      Merci à tous et particulièrement à toi, ça fonctionne super !

    • [^] # Re: Certainement pas la plus simple...

      Posté par  . Évalué à 3.

      C'est un de la menuiserie à la hache, mais avec quelques adpatations comme les délimiteurs, ça devrait le faire. Et ça donne déjà un résultat assez propre:

      paste -d '\t' <(sed -n -e '/Layer 2/q' -e '/Layer 1/,$p' in) <(sed -n -e '/Layer 3/q' -e '/Layer 2/,$p' in) <(sed -n -e '/Layer 4/q' -e '/Layer 3/,$p' in)
      
    • [^] # Re: Certainement pas la plus simple...

      Posté par  . Évalué à 3.

      mouais ça c'est du bourrin, surtout coté nombre d'appel :P

      read a b <(sed -n '/Layer [12]/=' )
      d=$((b-a)
      split -l $d ficher.txt trucInexistant
      paste -d' ' trucInexistant* > resultat.txt
      rm trucInexistant*

      on peut améliorer et se placer dans un nouveau répertoire temporaire crée pour l'occasion puis le supprimer, mais j'ai la flemme :P typiquement :

      TDIR=`mktemp -d`
      
      trap "{ cd - ; rm -rf $TDIR; exit 255; }" SIGINT EXIT
      
      cd $TDIR

      en début de code, mais faut gérer le chemin du fichier d'entrée pas compliqué non plus.

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.