Grep? besoin de la colonne d'une seq recherchee: RESOLU

Grep? besoin de la colonne d'une seq recherchee: RESOLU - Shell/Batch - Programmation

Marsh Posté le 06-08-2004 à 09:57:44    

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 reagrdé 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 17-08-2004 à 18:04:56
Reply

Marsh Posté le 06-08-2004 à 09:57:44   

Reply

Marsh Posté le 17-08-2004 à 18:11:53    

Voici ce que j'ai fait:
 

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,/(\<(25|251|252|253|254)[ ]251\> )|(\<(10|11|15|20|253|252|254|25|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|251|253|25|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|251|252|254|25|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)[ ]254\> )|(\<(10|11|37|20)[ ]37\> )|(\<(10|15|25|251|252|253|254|26|27|30|31|32|33|34|35|36|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)[]20\> )|(\<(15|251|252|253|254|25|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)[ ]10\> )/)){
  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. str=substr(str, R1 + L2)
  23. pos += value
  24. annee=dr_annee+1
  25. i=length($0)
  26. j=nb_colonne
  27. while(i>pos){
  28. i += -length($j)-1
  29. annee=annee-1
  30. j=j-1
  31. }
  32. print  FNR " : "  pos " : " annee " : " $O
  33. value += R1 + L2 -1     
  34. }               
  35. }' $@ > $fich_out
  36. echo Taille: ;
  37. wc -l $fich_out;


 
Cela m'affiche la ligne, la colonne, et surtout l'annee (si l'on precise avant le nombre de colonnes et la derniere annee) ou se trouve l'erreur. Par contre, j'ai encore un probleme avec els regexp. Comment ecrire '\<(tout ce qui n'est aps 251) (tout ce qui n'est aps 252) (tout ce qui n'est aps 253) 254 (zero ou plusieurs 254)\>'?
 tout en ne captant pas deux fois la meme erreur ( par exemple, '251 253 252 254 254 254'
 
Merci d'avance pour votre aide!

Reply

Sujets relatifs:

Leave a Replay

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