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 :
- 4 0 0 41 50 999 999 41 50 42 50 999
- 5 0 0 42 72 999 999 42 62 42 72 40
- 6 0 0 72 999 999 999 44 50 42 72 70
- 7 0 0 999 72 41 41 40 40 999 37 20
- 8 0 0 999 72 41 40 70 72 42 27 40
- 9 0 0 50 41 72 40 70 41 50 41 40
- 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 :
- if test $# -ne 4 # si le nombre de parametres n'est pas 3
- then # affiche l'usage
- echo 'Usage: ./rech.sh dr_annee nb_colonne fich_out fich_in '
- echo 'Ce programme cherche les sequences d erreur dans le fichier'
- echo 'Il renvoie un fichier avec la ligne, la colonne et l annee ou la sequence est erronee'
- exit 1
- fi
- dr_annee=$1
- nb_colonne=$2
- fich_out=$3
- shift
- shift
- shift
- 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\> )/)){
- size = RSTART + RLENGTH
- R1=RSTART
- L1=RLENGTH
- #str_temp=substr(str,RSTART)
- #pos_temp=match(str_temp,/\<[0-9][0-9]*\>/)
- #R2=RSTART
- #L2=RLENGTH
- L2=L1
- #print R1
- #print L1
- str=substr(str, R1 + L2)
- pos += value
- #print pos
- annee=dr_annee+1
- i=length($0)
- #print i
- j=nb_colonne
- #print j
- while(i>=pos){
- i += -length($j)-1
- #print i
- annee=annee-1
- #print annee
- j=j-1
- }
- #print FNR " : " pos " : " annee " : " $O
- print FNR " : " $O
- value += R1 + L2 -1
- }
- }' $@ >> $fich_out
- echo Taille: ;
- 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+