Extraction / traitement champ 1 avec awk (ou autre)

Résolu
Bonjour,

Actuellement je récupère dans un fichier txt une liste de fichier avec des valeurs associées sur 4/5 colonnes:

 #> cat data_extrat.txt
PLANTE1_TERRASSE_205_1o1-j00-s07.txt ;-1.8 ;3.24 ;0.13
PLANTE1_TERRASSE_205_1o1-j02-s07.txt ;-3.2 ;0.56 ;0.11
PLANTE1_TERRASSE_205_1o1-j02_temp.txt ;15.8 ;22.1 ;20.1 ;0.8
PLANTE1_TERRASSE_205_1o1-j02_g20-s07.txt ;5.4 ;0.56 ;0.11
PLANTE1_TERRASSE_205_1o1-j02_g20_temp.txt ;18.2 ;21.3 ;20.1 ;0.7


Je voudrais pouvoir le remanier légèrement afin de pouvoir mettre en colonne x (en premièr ou peu importe d'ailleurs)
Le jour et le paramètre.
Le jour = j00 / j02 ..
Le paramètre = _temp / g20 / g20_temp ...

Pour avoir quelques chose au final comme ça:

 #> cat data_extrat.txt
j00; PLANTE1_TERRASSE_205_1o1-j00-s07.txt;-1.8 ;3.24 ;0.13
j02; PLANTE1_TERRASSE_205_1o1-j02-s07.txt -3.2 ;0.56 ;0.11
j02_temp; PLANTE1_TERRASSE_205_1o1-j02_temp.txt;15.8;22.1;20.1;0.8
j02_g20; PLANTE1_TERRASSE_205_1o1-j02_g20-s07.txt;5.4;0.56;0.11
j02_g20_temp; PLANTE1_TERRASSE_205_1o1-j02_g20_temp.txt;18.2;21.3;20.1;0.7


j'arrive à extraire ma première information de la sorte:

 #> cat extract_test.sh
#!/bin/bash

for i in `cat data_extract.txt`
do
basename $i | sed s/.txt// | cut -d "j" -f2 | cut -d "-" -f1 | awk -F ";" '{print $1}' | sed 's/^0//' >> trial.txt
done


#> cat trial.txt
0
2
2_temp
2_g20
2_g20_temp


Après il faudrait que j'ajoute les autres colonnes à la suite… j'ai essayé de rajouter un pipe à la suite de ma commande pour mettre un awk -F ";" '{print ";"$2";"$3}' avant la redirection vers le fichier de sortie mais ça n'a pas l'air de fonctionner (en sortie j'ai que des ";;"

Donc mon interrogation: est-ce que déjà je prend mon problème dans le bon sens ?
Au final ce que je veux, c'est je part d'un tableau sur lequel j'extrais une données se trouvant dans une chaine de caractère contenu dans la première colonne.

merci à ceux qui sont arriver au bout de mon pavé....
et je peux essayer de reformuler si ce n'est pas clair :/

6 réponses

  1. merci à vous 3 pour les 3 réponse différentes!

    j'avoue avoir une petite préférence pour celle de dubcek... vous m'en voudrez pas :/
    0
    1. Contributeur
      Salut,

      Une version sed plus édulcorée :

      $ sed 'h;s/^[^-]*-\([^-.]*\).*/\1; /;G;s/\n//' plop
      j00; PLANTE1_TERRASSE_205_1o1-j00-s07.txt;-1.8 ;3.24 ;0.13
      j02; PLANTE1_TERRASSE_205_1o1-j02-s07.txt;-3.2 ;0.56 ;0.11
      j02_temp; PLANTE1_TERRASSE_205_1o1-j02_temp.txt;15.8 ;22.1 ;20.1 ;0.8
      j02_g20; PLANTE1_TERRASSE_205_1o1-j02_g20-s07.txt;5.4 ;0.56 ;0.11
      j02_g20_temp; PLANTE1_TERRASSE_205_1o1-j02_g20_temp.txt;18.2 ;21.3 ;20.1 ;0.7

      0
      1. Contributeur
        hello
        $ awk -F "[.-]" '{print $2 ";  " $0}' fichier
        j00; PLANTE1_TERRASSE_205_1o1-j00-s07.txt ;-1.8 ;3.24 ;0.13
        j02; PLANTE1_TERRASSE_205_1o1-j02-s07.txt ;-3.2 ;0.56 ;0.11
        j02_temp; PLANTE1_TERRASSE_205_1o1-j02_temp.txt ;15.8 ;22.1 ;20.1 ;0.8
        j02_g20; PLANTE1_TERRASSE_205_1o1-j02_g20-s07.txt ;5.4 ;0.56 ;0.11
        j02_g20_temp; PLANTE1_TERRASSE_205_1o1-j02_g20_temp.txt ;18.2 ;21.3 ;20.1 ;0.7
        1
        1. Contributeur
          Salut,

          Effectivement, c'est beaucoup moins alambiqué ;-)
          0
      2. en recopiant ton fichier plop de windows ça foncitonne,
        en repartant de mon fichier d'origine, qui n'a pas les espaces avant les ; ça ne fonctionne plus.... je me dit tu as utilisé l'esapce en tans que delimiteur de champs, et je vois dans ton lien que un esapce en sed "s'ecrit" /s mais je n'en voit pas dans ta commande....

        donc qu'est ce qui fait qu'un fichier configurer comme ça:
        PLANTE1_TERRASSE_205_1o1-j00-s07.txt  ;-1.8 ;3.24 ;0.13

        donne un resultat different d'un fichier comme ça:
        PLANTE1_TERRASSE_205_1o1-j00-s07.txt;-1.8;3.24;0.13


        j'ai commencé à essayer de décortiquer ta commande, mais le premier gros paragraphe me pose encore des soucis

         sed 's/^\([^-]*-\)\([^-.]*\)\([-.][^;]*\)

        je suppose qu'il y a 4 blocs
          sed 's/^\

         ([^-]*-\)

         ([^-.]*\)

        \([-.][^;]*\)

        le second
        *\(.*\)/\2;  \1\2\3\4/' 
        me laisse à penser que c'est pour la ré-écriture des champs du tableau.
        0
        1. La commande (sans espace) :

           sed 's/^\([^-]*-\)\([^-.]*\)\([-.][^;]*\)\(.*\)/\2;  \1\2\3\4/'


          En fait il y a 4 sous-ensembles :

          \([^-]*-\)
          = PLANTE1_TERRASSE_205_1o1-

          \([^-.]*\)
          = -j00 ou j02_temp ou j02_g20

          \([-.][^;]*\)
          = -s07.txt ou .txt

          \(.*\)
          = ;-1.8 ;3.24 ;0.13

          Le
          ^
          indique le début de la ligne.
          0
      3. merci je vais regarder cette magnifique ligne sed !!

        la syntaxte de sed m'étonnera toujours
        0
        1. merci pour le lien
          0
      4. Salut,

        $ cat plop 
        PLANTE1_TERRASSE_205_1o1-j00-s07.txt ;-1.8 ;3.24 ;0.13
        PLANTE1_TERRASSE_205_1o1-j02-s07.txt ;-3.2 ;0.56 ;0.11
        PLANTE1_TERRASSE_205_1o1-j02_temp.txt ;15.8 ;22.1 ;20.1 ;0.8
        PLANTE1_TERRASSE_205_1o1-j02_g20-s07.txt ;5.4 ;0.56 ;0.11
        PLANTE1_TERRASSE_205_1o1-j02_g20_temp.txt ;18.2 ;21.3 ;20.1 ;0.7


        $ sed 's/^\([^-]*-\)\([^-.]*\)\([-.][^ ]*\)  *\(.*\)/\2;  \1\2\3\4/' plop 
        j00; PLANTE1_TERRASSE_205_1o1-j00-s07.txt;-1.8 ;3.24 ;0.13
        j02; PLANTE1_TERRASSE_205_1o1-j02-s07.txt;-3.2 ;0.56 ;0.11
        j02_temp; PLANTE1_TERRASSE_205_1o1-j02_temp.txt;15.8 ;22.1 ;20.1 ;0.8
        j02_g20; PLANTE1_TERRASSE_205_1o1-j02_g20-s07.txt;5.4 ;0.56 ;0.11
        j02_g20_temp; PLANTE1_TERRASSE_205_1o1-j02_g20_temp.txt;18.2 ;21.3 ;20.1 ;0.7
        0