| | mechard45 | Posté le 09/08/2004 @ 16:12 | Petit astucien
7 Messages
| Bonjour,
Je dispose d'un fichier de plusieurs lignes, constituées chacunes de nombres intercalés d'espace.
Parmi ces nombres je souhaite rechercher dans le cadre d'une procédure awk des suites du type:
253 254, ou 251 254 ou 3 254 en gros toutes les suite du type '(tous les nombres/caracteres , qui sont différents de x ou y ou z) espace nombre_maitre'
J'ai beaucoup de mal à traduire ceci en expression reguliere fonctionnant vraiment.
/\<[^(252|25)][^0-9]253\>|\<[^(251|25)][^0-9]252\>|\<[^25][^0-9]251\>/
(j'ai depuis remplace[^0-9] par /s ...)
Merci de m'aider, cela me bloque pour la suite de mon travail!
| | |
| |
| Publicité |
|
| | bizance | Posté le 19/08/2004 à 01:33 | Petit astucien
142 Messages
| salut
pourrais tu mettre un extrait de ton fichier a traiter ?
et donner des exemples de résultats souhaité.
Apres je t'aiderai [clindoeil] | | | | | mechard45 | Posté le 20/08/2004 à 15:37 | Petit astucien
7 Messages
| Bonjour,
Merci pour ta proposition.
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
[/code]
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;[/code]
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!
Meci,
A+ | | | |
| | Haut de la page |
| | Inscrivez-vous ! |
- Posez vos questions
- Résolvez vos problèmes
- Aidez les autres
- Participez et créez vos discussions
- Dialoguez en privé avec d'autres membres
- Suivez vos sujets préférés
- Affichez les signatures des membres
|
|