#1 Le 30/03/2015, à 11:10
- ichigo33kurosaki
AIDE sur le filtrage de données
Bonjour à tous et merci par avance à tous ceux qui contribueront à la solution de mon problème.
Voilà je voudrais savoir comment extraire certaine données d’un fichier.
…
$----$$----$$-------$$-------$$-------$
A B C D E
..
Sachant qu’il y a des données avant et après A, comment extraire toute les colonnes A, C, D, E,? (A ET C, D, E, n'on pas la même taille , taille(C)=taille(D)=taille(E))
L'idée serait de trouver la position de départ de A et à partir de cette position et de stocker les données voulues jusqu’à une certaine lignes finale
J’ai lu que la commande en shell awk pourrait m’aider mais je ne sais pas l’utiliser.
Donc je suis preneur d’explication sur la méthode avec awk où une méthode sous fortran.
MERCI
Hors ligne
#2 Le 30/03/2015, à 15:03
- αjet
Re : AIDE sur le filtrage de données
Awk est en effet puissant pour manipuler du texte. Pour qu'on puisse t'aider il faudrait que tu nous donnes plus d'info.
As tu un exemple de fichier, quitte a remplacer les données sensibles avec quelque-chose de plus génériqu ? A défaut de pourvoir partager ça, on aurait au moins d'avoir des reponses aux questions suivantes :
* Qu'est ce qui détermine début des données a collecter?
* Qu'est ce qui détermine la fin de serie (ligne vide?)?
* Comment sont séparées les colonnes? Espaces, virgules, points
* Quel type de données sont dans ces colonnes ? Nombres, dates, numéro de téléphone, email, texte général, autre ? Ça peut aider à comprendre les patterns a mettre en placer pour capturer ces données.
* Une fois les données extraites, qu'elle en est l'exploitation?
αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr
Hors ligne
#3 Le 30/03/2015, à 20:20
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
Bonjour ajet et merci pour ta réponse
....
TOTO
Tot min max abs int
espace
1000000000,001 2000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 2000000001,001 3000000001,001 4000000001,001 5000000001,001
.......................... .......................... .......................... .......................... ..........................
espace
......
voila donc l'idée est de pouvoir sortir les colonnes suivantes:
10000000,001 3000000000,001 4000000000,001 5000000000,001
10000001,001 3000000001,001 4000000001,001 5000000001,001
sans la deuxième et sans Tot min max abs int
Qu'est ce qui détermine début des données a collecter?
le début des données à collecter, c'est des nombres décimaux
Qu'est ce qui détermine la fin de serie (ligne vide?)?
La fin de la serie à collecter et en effet une ligne vide
Comment sont séparées les colonnes? Espaces, virgules, points
Les colonne sont séparés par des espaces
Quel type de données sont dans ces colonnes ? Nombres, dates, numéro de téléphone, email, texte général, autre ?
Les données sont des nombres décimaux
Dernière modification par benji1525 (Le 30/03/2015, à 21:00)
Hors ligne
#4 Le 30/03/2015, à 20:42
- MicP
Re : AIDE sur le filtrage de données
michel@debG53SW:~$ cat fichTest
1000000000,001 2000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 2000000001,001 3000000001,001 4000000001,001 5000000001,001
michel@debG53SW:~$
michel@debG53SW:~$ awk -F " " '{print $1,$3,$4,$5}' fichTest
1000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 3000000001,001 4000000001,001 5000000001,001
michel@debG53SW:~$
http://www.sysop.fr/linux-awk/
NOTE :
…des chiffres avec une dizaines de décimaux…
…Les données sont des nombres réelles…
Ces données sont des nombres décimaux,
dont la partie entière est composée de 10 chiffres,
et la partie décimale de 3 chiffres.
Dernière modification par MicP (Le 30/03/2015, à 20:59)
Hors ligne
#5 Le 30/03/2015, à 20:58
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
bonjour MicP et merci pour ta réponse ,
ce n'est pas si simple que sa, il faut en premier lieu parcourir le fichier test pour trouver le délimiteur TOTO, delà il faut sauter deux lignes et commencer l'extraction à partir de cette position puis l'arrêter avant la ligne vide dans mon cas, vu que après commence d'autre données.
Hors ligne
#6 Le 30/03/2015, à 21:07
- MicP
Re : AIDE sur le filtrage de données
Désolé", je n'avais pas bien compris quell était le contenu du fichier d'entrée :
TOTO
Tot min max abs int
espace
1000000000,001 2000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000000,001 2000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 2000000001,001 3000000001,001 4000000001,001 5000000001,001
1000000001,001 2000000001,001 3000000001,001 4000000001,001 5000000001,001
.......................... .......................... .......................... .......................... ..........................
espace
michel@debG53SW:~$ cat fichTest
TOTO
Tot min max abs int
espace
1000000000,001 2000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 2000000001,001 3000000001,001 4000000001,001 5000000001,001
.......................... .......................... .......................... .......................... ..........................
espace
michel@debG53SW:~$
michel@debG53SW:~$ sed -n '/^[0-9]/p' fichTest | awk -F " " '{print $1,$3,$4,$5}'
1000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 3000000001,001 4000000001,001 5000000001,001
michel@debG53SW:~$
S'il y a une solution en n'utilisant seulement que awk, je prendrai avec très grand plaisir l'information
Je vais chercher…, mais je ne doute pas que αjet (qui en sait beaucoup plus que moi) la proposera avant que je la trouve.
=======
Voilà Voilà :
michel@debG53SW:~$ cat fichTest | awk -F " " '/[0-9]/{print $1,$3,$4,$5}'
1000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 3000000001,001 4000000001,001 5000000001,001
michel@debG53SW:~$
Dernière modification par MicP (Le 30/03/2015, à 21:17)
Hors ligne
#7 Le 30/03/2015, à 21:16
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
merci MicP,
mais ou prends tu en compte la recherche de l'occurrence TOTO puis le saut de deux lignes avant l'extraction des données voulues?
et ou dis tu d'extraite les données par exemple jusqu'à la ligne n ? c'est à dire juste avant la ligne vide, à partir de laquelle commence d'autre données n'ayant pas le même format que le tableau que vous ai présenté
Hors ligne
#8 Le 30/03/2015, à 21:18
- MicP
Re : AIDE sur le filtrage de données
J'ai dû mal comprendre la demande…
Hors ligne
#9 Le 30/03/2015, à 21:27
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
Pour extraire les données voulues, je le vois avec plusieurs étapes:
1) aller à la ligne contenant TOTO (donc repérer la position je pense avec un grep )
2) sauter deux lignes afin d'arrivé au premier décimal à extraire
3) extraire les colonnes 1, 3, 4, 5 jusqu'à la ligne précédent la ligne vide nommée "espace( qui est vide en réalité) " ( là du coup exécuter une ou plusieurs commande pour extraire les données voulues)
Hors ligne
#10 Le 30/03/2015, à 21:27
- MicP
Re : AIDE sur le filtrage de données
Depuis la ligne contenant la chaîne "TOTO",
je n'extrais que les lignes commençant par un caractère numérique et en omettant le deuxième champ,
et je m'arrête à la première ligne vide qui suit la série de lignes contenant les valeurs numériques..
michel@debG53SW:~$ cat fichTest | awk -F " " -n '/TOTO/,/^$/{//d;p};/[0-9]/{print $1,$3,$4,$5}'
1000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 3000000001,001 4000000001,001 5000000001,001
michel@debG53SW:~$
Dernière modification par MicP (Le 30/03/2015, à 21:34)
Hors ligne
#11 Le 30/03/2015, à 21:33
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
tu pars du principe que TOTO est ta première ligne du fichier test la non?
Hors ligne
#12 Le 30/03/2015, à 21:35
- MicP
Re : AIDE sur le filtrage de données
Non, j'utilise toujours le fichier donné en exemple, mais s'il y avait des lignes avant ne contenant pas la chaîne TOTO, elles seraient ignorées
comme par exemple avec ce contenu, le résultat est le même :
une ligne avec n'importe quoi
n'importe quoi sauf la chaîne "toto" en majuscule
une ligne avec n'importe quoi
TOTO
Tot min max abs int
espace
1000000000,001 2000000000,001 3000000000,001 4000000000,001 5000000000,001
1000000001,001 2000000001,001 3000000001,001 4000000001,001 5000000001,001
.......................... .......................... .......................... .......................... ..........................
espace
jhgg
Si tu veux préciser que "TOTO" devra être en début de ligne, il suffit d'ajouter un caractère "^" avant "TOTO":
cat fichTest | awk -F " " -n '/^TOTO/,/^$/{//d;p};/[0-9]/{print $1,$3,$4,$5}'
Dernière modification par MicP (Le 30/03/2015, à 21:45)
Hors ligne
#13 Le 30/03/2015, à 21:43
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
ce que je voudrais arriver À faire c'est rechercher la ligne contenant "TOTO" et du coup appliquer après la commande que tu m'as donné.
J'aimerais aussi comprendre les options que tu as mis, pour ne pas copier coller sans savoir ce que sa veut dire:
awk -F " " -n '/TOTO/,/^$/{//d;p};/[0-9]/
awk -F " " va permettre d'afficher les champs séparés par des espaces
Que signifie les options: '/TOTO/,/^$/{//d;p};/[0-9]/ ?
Hors ligne
#14 Le 30/03/2015, à 21:55
- MicP
Re : AIDE sur le filtrage de données
les apostrophes encadrent la regexp
/TOTO/ => motif recherché en premier
/^$/ => motif de fin (ligne qui commence par un caractère de fin de ligne)
{//d;p} => Les deux fonctions sont sont regroupées par "{" et "}"
//d => Dans ce bloc, on efface les lignes vides
p => et on transmet ce qui reste à la regexp suivante
Tout le bloc de lignes situé entre les deux motifs sera traité par la regexp suivante (séparée par le ";")
/^[0-9]/ =>les lignes qui seront traitées débuterons par un caractère numérique.
==============
Zut, je viens de comprendre : tu as mis le mot "espace" en début de certaines lignes dans ton exemple
au lieu de laisser la ligne vide, du coup je ne comprenais pas de quelles lignes vides tu parlais…
Donne un exemple concret (sans rajouter de mots etc.), et met le entre des balises < code>< /code>
Dernière modification par MicP (Le 30/03/2015, à 22:21)
Hors ligne
#15 Le 30/03/2015, à 22:06
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
le saut de n ligne après avoir repéré TOTO est pris en compte par quelle commande?
/[0-9]/ signifie que l'on veut extraire des décimaux?
peut on rechercher un motif contenue de plusieurs mots espacés? par exemple si avant TOTO une ligne contient TOTO MAX
une autre ligne contient TOTO MIN comment faire pour n'extraire les données qu'après la ligne TOTO MIN?
Merci beaucoup MicP sa m'a beaucoup aidé.
Hors ligne
#16 Le 30/03/2015, à 22:23
- MicP
Re : AIDE sur le filtrage de données
En fait, ça ne fonctionne pas comme tu le voulais : Il me faudrait un exemple de contenu du fichier à traiter, sans aucun mot rajouté, ni autre interprétation qui pourrait prêter à confusion.
Merci
(désolé, j'avais mal compris…)
Dernière modification par MicP (Le 30/03/2015, à 22:24)
Hors ligne
#17 Le 30/03/2015, à 22:46
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
Nlignes
TOTO MIN 1
Tot1 min1 max1 abs1 int1
Tic1
1 2 3 4 5
6 7 8 9 10
etc
Nlignes (non vides)
TOTO MIN 2 PLUS
Tip2 tec2 mec2 mon2 lyp2
11 22 33 44 55
etc
Nlignes (non vides)
TOTO MIN REAL GOOD
T1 T2 T3 T4 T5
x1
103 (12 espaces) 203 (pareil) 303 (pareil) 403 (pareil) 503
104 204 304 404 504
(sur 50 lignes)…
153 253 353 453 505
n’importe quoi
autre chose
….
Fin fichier
donc objectif récupérer:
103 (12 espaces) 303 (pareil) 403 503
104 304 404 504
(sur 50 lignes)…
153 353 453 505
donc la le mot TOTO va apparaitre plusieurs fois dans le fichier mais les données qui m'intéresse se trouve après "TOTO MIN REAL GOOD"
cet fois les espaces sont bien respectés et les lignes vides aussi (dsl pour le décalage)
Dernière modification par benji1525 (Le 30/03/2015, à 23:30)
Hors ligne
#18 Le 30/03/2015, à 22:46
- αjet
Re : AIDE sur le filtrage de données
Je ne serais pas capable trouver une solution a l'aide de awk tout seul. En m'inspirant de ce que MicP a fait tout a l'heure, voici ce que je ferais.
* Je commencerait par un premier sed qui aurait pour but de filter le bloc de texte commencant par TOTO et finissant par une ligne vide
* Ensuite, deuxieme sed pour filtrer les lignes numeriques
* awk pour recuperer les differentes colonnes.
Je pense que ca donnerais quelquechose comme cela (non testé):
sed -n '1!N; /TOTO\s*\n(.+\n){2}(([0-9,]+\s*){5}\n)+\n/p' fichtest | sed -n '/^[0-9]/p' | awk -F " " '{print $1,$3,$4,$5}'
Dans le 1er sed, l'instruction 1!N signifie que je place toutes les lignes dans un buffer temporaire. Cela permet a sed de faire executer des regex sur plusieurs lignes a la foi car par defaut il traite l'entrée ligne par ligne. Source: http://www.refining-linux.org/archives/ … d-replace/
J'espere que ma premiere regex est bien construite pour capturer le texte.
Dernière modification par αjet (Le 30/03/2015, à 22:48)
αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr
Hors ligne
#19 Le 30/03/2015, à 23:04
- MicP
Re : AIDE sur le filtrage de données
J'ai numéroté chaque ligne pour servir de référence, mais ce sear le copié/collé de ton exemple que j'utiliserai.
1
2 Tip2 tec2 mec2 mon2 lyp2
3 11 22 33 44 55
4 etc
5
6 Nlignes (non vides)
7
8 TOTO MIN REAL GOOD
9
10 T1 T2 T3 T4 T5
11 x1
12
13 103 (12 espaces) 203 (pareil) 303 (pareil) 403 (pareil) 503
14 104 204 304 404 504
15 (sur 50 lignes)…
16 153 253 353 453 505
17
18 n’importe quoi
19 autre chose
20 ….
21 Fin fichier
22
Dernière modification par MicP (Le 30/03/2015, à 23:38)
Hors ligne
#20 Le 30/03/2015, à 23:28
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
Désolé MicP entre temps j'ai modifié mon code
escuse moi
Hors ligne
#21 Le 30/03/2015, à 23:31
- MicP
Re : AIDE sur le filtrage de données
Pas de problème, je fatigue un peu moi aussi
Je viens de mettre à jour le fichier numéroté en fonction de ta modification.
Dernière modification par MicP (Le 31/03/2015, à 00:03)
Hors ligne
#22 Le 30/03/2015, à 23:41
- Postmortem
Re : AIDE sur le filtrage de données
Salut,
J'espère avoir bien compris...
Je recherche une ligne contenant « TOTO MIN REAL GOOD » et j'affiche les colonnes 1 et 3 à 5 quand la ligne commence par un chiffre.
J'arrête d'afficher à la première ligne vide qui suit au moins une ligne commençant par un chiffre.
Et j'ai posé que tes colonnes faisait 15 caractères.
$ cat /tmp/test.txt
Nlignes
TOTO MIN 1
Tot1 min1 max1 abs1 int1
Tic1
1 2 3 4 5
Nlignes (non vides)
TOTO MIN 2 PLUS
Tip2 tec2 mec2 mon2 lyp2
11 22 33 44 55
TOTO MIN REAL GOOD
T1 T2 T3 T4 T5
x1
103 203 303 403 503
104 204 304 404 504
153 253 353 453 505
n’importe quoi
autre chose
….
Fin fichier
$ awk 'BEGIN{FIELDWIDTHS="15 15 15 15 15"}
/TOTO MIN REAL GOOD/ { i=1 }
i && /^[0-9]/ { j=1; print $1,$3,$4,$5 }
i && j && /^$/ {i=j=0}' /tmp/test.txt
103 303 403 503
104 304 404 504
153 353 453 505
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#23 Le 31/03/2015, à 00:05
- MicP
Re : AIDE sur le filtrage de données
@benji1525
J'ai jeté un œil à ton texte d'exemple, mais j'ai trouvé 10 caractères "espace" en fin de ligne (juste après le nombre "505")
Dois-je tenir compte de ces espaces après le dernier nombre de la série, ou est-ce une erreur de copié/collé.
Les 12 espaces séparant les champs ne seraient-ils pas (à l'origine) une série de caractères de tabulation ?
Dernière modification par MicP (Le 31/03/2015, à 10:41)
Hors ligne
#24 Le 31/03/2015, à 20:49
- ichigo33kurosaki
Re : AIDE sur le filtrage de données
voila c'est exactement ce style de fichier
http://femci.gsfc.nasa.gov/modal_wtc/mmp.html
l'objectif est de rechercher "MODAL EFFECTIVE MASS" et de stocker les données situées dessous les colonnes suivantes "mode no" T1 T2 T3 R1 R2 R3
le nombre d'espace, les lignes vides , c'est exactement sa.
Comme on peut le voir il y a plusieurs lignes qui commencent par MODAL EFFECTIVE
Dernière modification par benji1525 (Le 31/03/2015, à 21:54)
Hors ligne
#25 Le 01/04/2015, à 00:28
- Postmortem
Re : AIDE sur le filtrage de données
Salut,
awk '/^[ \t]*MODAL EFFECTIVE MASS[ \t]*$/ { i=1 }
i && $1 ~ /^[0-9]+$/ { j=1; print $1,$3,$4,$5 }
i && j && $1 !~ /^[0-9]+$/ {i=j=0}' fichier
J'ai pas testé par contre.
Dernière modification par Postmortem (Le 01/04/2015, à 00:30)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne