Extraction / traitement champ 1 avec awk (ou autre)

Résolu/Fermé
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 - Modifié par snow_frog le 8/03/2016 à 14:08
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 - 9 mars 2016 à 07:56
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 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
Modifié par dubcek le 8/03/2016 à 16:53
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
8 mars 2016 à 17:34
Salut,

Effectivement, c'est beaucoup moins alambiqué ;-)
0
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 jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
8 mars 2016 à 14:46
merci je vais regarder cette magnifique ligne sed !!

la syntaxte de sed m'étonnera toujours
0
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 jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
8 mars 2016 à 16:07
merci pour le lien
0
snow_frog Messages postés 216 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
8 mars 2016 à 16:24
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
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
8 mars 2016 à 18:34
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 jeudi 5 février 2009 Statut Membre Dernière intervention 26 juin 2020 139
9 mars 2016 à 07:56
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