Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/03/2015, à 12: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, à 16: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, à 21: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, à 22:00)

Hors ligne

#4 Le 30/03/2015, à 21: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, à 21:59)

Hors ligne

#5 Le 30/03/2015, à 21: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, à 22: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 smile

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, à 22:17)

Hors ligne

#7 Le 30/03/2015, à 22: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, à 22:18

MicP

Re : AIDE sur le filtrage de données

J'ai dû mal comprendre la demande…

Hors ligne

#9 Le 30/03/2015, à 22: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, à 22: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, à 22:34)

Hors ligne

#11 Le 30/03/2015, à 22: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, à 22: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, à 22:45)

Hors ligne

#13 Le 30/03/2015, à 22: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, à 22: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, à 23:21)

Hors ligne

#15 Le 30/03/2015, à 23: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, à 23: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 smile

(désolé, j'avais mal compris…)

Dernière modification par MicP (Le 30/03/2015, à 23:24)

Hors ligne

#17 Le 30/03/2015, à 23: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 31/03/2015, à 00:30)

Hors ligne

#18 Le 30/03/2015, à 23: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, à 23:48)


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#19 Le 31/03/2015, à 00: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 31/03/2015, à 00:38)

Hors ligne

#20 Le 31/03/2015, à 00: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 31/03/2015, à 00:31

MicP

Re : AIDE sur le filtrage de données

Pas de problème, je fatigue un peu moi aussi smile

Je viens de mettre à jour le fichier numéroté en fonction de ta modification.

Dernière modification par MicP (Le 31/03/2015, à 01:03)

Hors ligne

#22 Le 31/03/2015, à 00: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, à 01: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, à 11:41)

Hors ligne

#24 Le 31/03/2015, à 21: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, à 22:54)

Hors ligne

#25 Le 01/04/2015, à 01: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, à 01:30)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne