[RESOLU] Grep? awk?(resolu) => Pb sur l'expression reguliere

Grep? awk?(resolu) => Pb sur l'expression reguliere [RESOLU] - Linux et OS Alternatifs

Marsh Posté le 06-08-2004 à 09:58:59    

Bonjour,
J'ai un fichier de plusieurs lignes, dans lesquelles je recherche une sequence d'erreur. En plus d'avoir le numero de la ligne fourni par grep
 
(jusqu'à maintenant je fais:
grep -nE -i ' 15 40 ' assol_codes.csv >> erreur.out )
 
je voudrais avoir le numero de la colonne ou se trouve la sequence recherchee. Faut il rajouter une option, ou rediriger la sortie?  
 
J'ai regardé aussi du cote de la commande awk, mais idem pour interpréter le manuel... Il faut faire un programme ?
 
Je ne peux pas faire tout simplement:
 
[xterm] gawk -option_donnant_nb_ling -option_donnant_nb_colo 'texte a rechercher' fichier_entree >> sortie
 
?
 
J'ai trouve une commande match, mais je ne vois aps vraiment comment m'en servir.
En plus, il peut y avoir plusieurs erreurs différents sur une meme ligne de mon fichier,et je voudrais qu'il parcourt toutes les lignes, et me releve toutes les lignes ou j'ai au moins une erreur en y rajoutant l'endroit où elles sont (tableau avec match?) , comme avec grep un peu.
C pas possible?
 
Merci pour votre réflexion...
 
marion


Message édité par marionnet' le 20-08-2004 à 15:49:10
Reply

Marsh Posté le 06-08-2004 à 09:58:59   

Reply

Marsh Posté le 07-08-2004 à 12:28:45    

Les séquences d'erreur sont elles délimitées ?

Reply

Marsh Posté le 09-08-2004 à 11:01:06    

En fait, mes séquences que je recherche sont du style:
(tout sauf 252 ou 25) espace 253
 
OU
 
15 espace (tout sauf 15)..
 
J'ai trouve un programme, amsi j'ai encore quelques problemes:
 
#!/bin/sh                                                                                    
 
# appel a la fonction: ./grep.sh a nom_fichier le a pouvant etre remplace par n'importe quoi, cpour remplir...
 
pattern=$1
shift
awk '{ str=$0; value=0; while (pos = match(str,/\<[^252][^0-9]253\>/)) {        
size = RSTART + RLENGTH                                        
str=substr(str, RSTART + RLENGTH)                
pos += value
print  FNR ":" pos ":" $0              
value += RSTART + RLENGTH - 1                
}                
}' $@  
 
mais quand je le alnce sur un fichier test, il ne me reconnait aps les 253 253 qui sont aussi une erreur...
 
[calcul@PC82 Adaptation]$ ./rech_test.sh a test_luz
2:1:3 253 253 6 253 253
2:11:3 253 253 6 253 253
6:4:10 6 253
8:1:8 253 253
 Ici par exemple il ne tient pas compte du 252 suivi de 253, or 253 /= 253, non?
 
Si vous avez une idee d'ou ca vient, merci de me le dire!

Reply

Marsh Posté le 09-08-2004 à 11:41:35    

marionnet' a écrit :

En fait, mes séquences que je recherche sont du style:
(tout sauf 252 ou 25) espace 253


 
ton match doit trouver: 26espace253, 01espace253, espaceespace253
mais ne doit pas ressortir : 252espace253 ni 25espace253 ?
c'est cela ?  :??:

Reply

Marsh Posté le 09-08-2004 à 11:54:49    

Pourquoi [^0-9] alors que tu sais que tu veux un espace à cet endroit ?

Reply

Marsh Posté le 09-08-2004 à 12:18:53    

Mes lignes sont composees de nombres intercales d'esapce.
Mon match doit ressortir:
       26 253, 253 253 (j'ai du mal avec celui la...) 251 253, 3 253, mais ne doit pas me donner 25 253 ou 252 253 .
 
En ce qui concerne le [^0-9], c'est aprce que la fonction /s ne marchait pas, mais j'ai trouve [[blank:]] qui marche donc c bon. Et en fait ej viens de retester /s et ca marche aussi... Comme quoi...
 
Par contre, je trouve toujours pas de solution pour mon expression reguliere, je fais plein de test ^(25|251)$\s252, mais niet..
 
Alors vos réponses sont les bienvenues, merci!

Reply

Marsh Posté le 20-08-2004 à 15:48:26    

Bonjour,
J'ai reussi a ameliorer mon petit programme(fourni par qqn, merci ;-)), maintenant il me refile l'annee. Pour les regexp, c pas encore trop ca, mais je crois que c bon, Cependant, si vous avez encore une idee, y a no pb. Je vous laisse mon code au cas ou ca interesse quelqu'un
Voici un extrait de mon jeu de donnees:

Code :
  1. 4 0 0 41 50 999 999 41 50 42 50 999
  2. 5 0 0 42 72 999 999 42 62 42 72 40
  3. 6 0 0 72 999 999 999 44 50 42 72 70
  4. 7 0 0 999 72 41 41 40 40 999 37 20
  5. 8 0 0 999 72 41 40 70 72 42 27 40
  6. 9 0 0 50 41 72 40 70 41 50 41 40
  7. 10 0 0 61 41 72 72 70 44 50 41 40


 
Je cherche toutes les sequences qui ne respectent pas 251 252 253 254, ou 37 20 20 10, et apres certaines valeurs je ne dois pas en avoir d'autres (assez complexes comme conditions...)
Voici le programme que j'ai actuellement et qui a l'air en fait de fonctionner maintenant:

Code :
  1. if test $# -ne 4       # si le nombre de parametres n'est pas 3
  2. then                    # affiche l'usage
  3.     echo 'Usage: ./rech.sh dr_annee nb_colonne fich_out fich_in '
  4.     echo 'Ce programme cherche les sequences d erreur dans le fichier'
  5.    echo 'Il renvoie un fichier avec la ligne, la colonne et l annee ou la sequence est erronee'
  6.   exit 1
  7. fi
  8. dr_annee=$1
  9. nb_colonne=$2
  10. fich_out=$3
  11. shift
  12. shift
  13. shift
  14. awk '{ nb_colonne='$nb_colonne';  dr_annee='$dr_annee'; str=$0; value=0; while (pos = match(str,/(\<(10|11|15|20|25|252|253|254|26|27|30|31|32|33|34|35|36|37|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91|999)[ ]252\> )|(\<(10|11|15|20|25|252|253|254|26|27|30|31|32|33|34|35|36|37|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91|999)[ ](10|11|15|20|25|251|253|254|26|27|30|31|32|33|34|35|36|37|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91|999)[ ]253\> )|(\<(10|11|15|20|25|252|253|254|26|27|30|31|32|33|34|35|36|37|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91|999)[ ]252[ ]253\> )/)){
  15. size = RSTART + RLENGTH 
  16. R1=RSTART
  17. L1=RLENGTH
  18. #str_temp=substr(str,RSTART)
  19. #pos_temp=match(str_temp,/\<[0-9][0-9]*\>/)
  20. #R2=RSTART
  21. #L2=RLENGTH
  22. L2=L1
  23. #print R1
  24. #print L1
  25. str=substr(str, R1 + L2)
  26. pos += value
  27. #print pos
  28. annee=dr_annee+1
  29. i=length($0)
  30. #print i
  31. j=nb_colonne
  32. #print j
  33. while(i>=pos){
  34. i += -length($j)-1
  35. #print i
  36. annee=annee-1
  37. #print annee
  38. j=j-1
  39. }
  40. #print  FNR " : "  pos " : " annee " : " $O
  41. print FNR " : "  $O
  42. value += R1 + L2 -1     
  43. }               
  44. }' $@  >>  $fich_out
  45. echo Taille: ;
  46. wc -l $fich_out;


 
J'effectue un tri apres sur les lignes.
 
Voila si vous avez qqch de plus court, ou que vous voyez des erreurs n'hésitez pas à me le dire!
Merci,
A+

Reply

Sujets relatifs:

Leave a Replay

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