[awk/sed] Traitement du fichier de stats boinc...

Traitement du fichier de stats boinc... [awk/sed] - Shell/Batch - Programmation

Marsh Posté le 10-06-2004 à 22:28:41    

Bonjour :hello:
 
Le fichier de stats de Berkeley pour boinc est assez enorme dans la version Seti2. Genre 900 Mo, avec plein d'infos inutiles  :pfff:  
 
Du coup, j'essaye de le nettoyer un peu, en enlevant les personnes qui sont à zéro. En gros, le fichier donne ca :
 

Code :
  1. <user>
  2. <id>3336825</id>
  3. <name>bbi38-ro</name>
  4. <url></url>
  5. <country>Germany</country>
  6. <create_time>1086591053</create_time>
  7. <total_credit>100.988396</total_credit>
  8. <expavg_credit>9.615422</expavg_credit>
  9. <cpid>27e983057765c24d53c1e6feeb491abd</cpid>
  10. </user>


 
Certains sont à 0.000000 en total_credit par exemple.
Ma méthode à moi bourrin que j'ai :
tr -d '\n' < fichier >sortie
sed -i 's#</user>#</user>\n#g' sortie
grep -v '0.0000000' sortie
 
pour n'avoir que les personnes ayant un scores différent de 0.00000
 
J'ai prevenu, c'est bourrin...
Je me dit qu'avec awk, il y a moyen de faire plus propre. Autant je maitrise un peu sed et grep, autant là, j'ai beaucoup de mal.
Le but est de remplir une base sql. Elle permettrait de faire pour Seti2, ce que je fait dejà pour Astropulse : http://stats.boinc.fr
 
Merci beaucoup pour tout conseils ou piste :jap:
 
 


---------------
Da Breizh WoRlD DoMIna7iOn T3aM * Baptiste Mary blog
Reply

Marsh Posté le 10-06-2004 à 22:28:41   

Reply

Marsh Posté le 11-06-2004 à 12:27:00    

[:belgarion_cer] de soutien d'un ignare absolu dans ce domaine :D


---------------
Les Road Runners sur BOINC - Mon site sur le modélisme radio-commandé
Reply

Marsh Posté le 13-06-2004 à 12:36:51    

Reply

Marsh Posté le 13-06-2004 à 16:33:25    

un coup de perl et on en parle plus :o

Reply

Marsh Posté le 14-06-2004 à 00:44:13    

C'est pas faux, mais je pense que ca sera pas aussi rapide, d'autre part, sur mon serveur ovh, je n'ai pas perl (quoi que, c'est un serveur dedié ... :ange: :D), donc, je pourrais le mettre, mais bon :/
Donc, des commandes unix de bases, ca serait pas mal en fait.
 
Petite question, je n'ai jamais réussi avec 'sed' à enlever les fin de lignes. Les remplacer, oui, les enlever, non :/
 
Genre un sed 's/\n//g' fichier   ca marche pas.
 
C'est pour mettre tout le ficher en une seule ligne par exemple.
 
Merci pour tout debut de soluce.


Message édité par TetardKing le 14-06-2004 à 00:44:36
Reply

Marsh Posté le 14-06-2004 à 00:48:59    

Taz a écrit :

un coup de perl et on en parle plus :o


 
+1


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 14-06-2004 à 07:28:34    

Reply

Marsh Posté le 14-06-2004 à 07:30:22    

fais le en php avec des regex :o

Reply

Marsh Posté le 14-06-2004 à 11:56:05    

Taz a écrit :

fais le en php avec des regex :o


C'est ce que je fait habituellement sur le fichier de Boinc Astropulse, qui ne fait que 4 Mo. Là, 900 Mo, le serveur va exploser :D
Bon, enfin, si vous le dites... vous n'avez pas l'air d'apprecier l'idée d'un prétraitement en C :jap:
 
Je vais rester avec mes commandes unix ;)


Message édité par TetardKing le 14-06-2004 à 11:56:24

---------------
Da Breizh WoRlD DoMIna7iOn T3aM * Baptiste Mary blog
Reply

Marsh Posté le 14-06-2004 à 12:02:11    

biensur que non.
 
et y a pas de prétraitement en C

Reply

Marsh Posté le 14-06-2004 à 12:02:11   

Reply

Marsh Posté le 16-06-2004 à 09:36:11    

Bonjour
je te propose cette piste :  
avec awk on peut redefinir le separateur de champ et de ligne
ex classique : \n pour séparer les champs et \n\n (ligne vide) pour la fin d'enregistrement
 
si ton fichier a cette structure (ligne vide pour separer chaque enregistrement, tu peux ecrire ce genre de truc :
nawk  'BEGIN{FS='\x0a';RS='\x0a\x0a'} $7 !~ />[0\.]+</ {print ;}' fichier
(Avec ma version de awk j'ai du remplacer \n par \x0a)
qui t'affiche chaque enregistrement ou le champ 7 ne contient pas qque chose d'un montant constitué de 0 et de .
 
Salut

Reply

Marsh Posté le 16-06-2004 à 11:23:07    

lol, quel bourrin :)
En plus tu dois avoir des lib pour parser du xml proprement.
Je regarde une solution en awk

Reply

Marsh Posté le 16-06-2004 à 11:28:18    

awk '
BEGIN { credit=1; user=""; }
{ user = user $0 "\n"; }
/<\/user>/ { if (credit!=0) { printf ("%s", user); } credit=1; user=""; }
/<total_credit>0.00/ { credit=0; }
'

Reply

Marsh Posté le 18-06-2004 à 09:33:21    

ArSuniK a écrit :

awk '
BEGIN { credit=1; user=""; }
{ user = user $0 "\n"; }
/<\/user>/ { if (credit!=0) { printf ("%s", user); } credit=1; user=""; }
/<total_credit>0.00/ { credit=0; }
'


Merci à tous, je vais regarder ca cet aprem'. J'ai réécrit mon script en perl, ca va nettement plus vite qu'en php, mais ca met encore 10 bonne minutes pour les 900 mo. Merci :jap:


---------------
Da Breizh WoRlD DoMIna7iOn T3aM * Baptiste Mary blog
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed