Extraction / traitement champ 1 avec awk (ou autre)

Résolu
snow_frog Messages postés 216 Date d'inscription   Statut Membre Dernière intervention   -  
snow_frog Messages postés 216 Date d'inscription   Statut Membre Dernière intervention   -
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

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Salut,

Effectivement, c'est beaucoup moins alambiqué ;-)
0
UnGars
 
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
snow_frog Messages postés 216 Date d'inscription   Statut Membre Dernière intervention   139
 
merci je vais regarder cette magnifique ligne sed !!

la syntaxte de sed m'étonnera toujours
0
UnGars
 
Pour t'aider à comprendre plus facilement cette syntaxe :
Les sous-expressions et références arrières
0
snow_frog Messages postés 216 Date d'inscription   Statut Membre Dernière intervention   139
 
merci pour le lien
0
snow_frog Messages postés 216 Date d'inscription   Statut Membre Dernière intervention   139
 
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
UnGars
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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
snow_frog Messages postés 216 Date d'inscription   Statut Membre Dernière intervention   139
 
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