#51 Le 01/02/2022, à 13:24
- MicP
Re : [RESOLU]traitement "chaîne de caratères"
Dans ses fichiers de données,
le caractère qui est utilisé pour séparer le nom du prénom est le caractère étoile
et le prénom semble être suivi d'un caractère espace (à confirmer au cas ou il s'agirait d'une tabulation)
donc, s'il veux pouvoir trouver tous les noms qui commencent TARTAN et dont le prénom est LUCIEN
il faudrait :
qu'il fasse précéder le début du nom par le caractère accent circonflexe <=> pour indiquer que le premier caractère de ce nom est le premier caractère de la ligne,
qu'il fasse suivre le début du nom par un point suivit d'une étoile <=> pour indiquer qu'il peut y avoir zéro ou plusieurs caractères qui suivent
puis qu'il "échappe" le caractère étoile qui précède le prénom <=> pour indiquer que c'est bien le caractère étoile
et qu'il fasse suivre le prénom d'un caractère espace (ou tabutation si c'est le cas)<=> pour indiquer qu'il n'y a plus d'autres caractères dans ce prénom
ce qui donnerait :
grep "^TARTAN.*\*LUCIEN " deces-2020.txt
Dans ce motif de recherche, le point correspond à n'importe quel caractère
et le caractère étoile (s'il n'a pas été échappé) permet d'indiquer que le caractère qui le précède peut être répété zéro ou plusieurs fois
si un caractère est précédé d'un caractère \ alors on dit qu'il a été échappé.
Dernière modification par MicP (Le 01/02/2022, à 13:32)
Hors ligne
#52 Le 01/02/2022, à 13:34
- Watael
Re : [RESOLU]traitement "chaîne de caratères"
peut-il y avoir un gain à utiliser une expression moins gloutonne* :
grep "^TARTAN[^*]*\*LUCIEN[[:blank:]]" décès.txt
[[:blank:]] parce qu'on ne sait pas exactement ce qu'il y a entre le prénom usuel et les autres prénoms
[^*]* expression non gloutonne.
--
* peut-on être certain qu'il n'y en aura pas d'autres sur l'enregistrement ?
edit: correction ' -> "
merci micP.
Dernière modification par Watael (Le 01/02/2022, à 16:45)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#53 Le 01/02/2022, à 13:46
- MicP
Re : [RESOLU]traitement "chaîne de caratères"
Ok, merci pour l'expression non gloutonne (j'adore apprendre et tu me régales )
Si j'ai bien compris, [^*] signifie : tout caractère qui ne serait pas un caractère étoile
Dernière modification par MicP (Le 01/02/2022, à 20:30)
Hors ligne
#54 Le 01/02/2022, à 16:39
- LeoMajor
Re : [RESOLU]traitement "chaîne de caratères"
salut,
pour de simples consultations
:~$ read -p "nom ?" a; read -p "prenom ?" b; read -p "annee naissance ?" c ; read -p "annee deces ?" d; select item in $(lynx -dump "https://www.deces-en-france.fr/resultats?nom=${a}&prenoms=${b}&annee_naissance=${c}&annee_deces=${d}" | awk '/resultat/ && $1>=10 {$1=""; ps[$0]++ }; END {for (p in ps)print p; done}' | sort -V); do [ "$REPLY" -eq 0 ] && break || { echo "$item" ; lynx -dump "$item" | awk '/^\s+Né/,/^\s+Acte de décès/';}; done
nom ?smet
prenom ?jean
annee naissance ?
annee deces ?
1) https://www.deces-en-france.fr/resultats/1097428-smet-jeannine-marguerite-constance 8) https://www.deces-en-france.fr/resultats/17577499-smet-jean-andre-constant
2) https://www.deces-en-france.fr/resultats/1109570-smet-jeanne-julia-cornelie 9) https://www.deces-en-france.fr/resultats/19180515-smet-jeannine
3) https://www.deces-en-france.fr/resultats/8294671-smet-jeanne-marie 10) https://www.deces-en-france.fr/resultats/22381290-smet-jean-michel
4) https://www.deces-en-france.fr/resultats/8422131-smet-jean-francois-emile 11) https://www.deces-en-france.fr/resultats/23094968-smet-jean-alfred
5) https://www.deces-en-france.fr/resultats/10192562-smet-jeannine-marie-therese 12) https://www.deces-en-france.fr/resultats/23666551-smet-jean-philippe-leo
6) https://www.deces-en-france.fr/resultats/12561412-smet-jeannine-eleonore-augusta 13) https://www.deces-en-france.fr/resultats/24785551-smet-jeanne-marie
7) https://www.deces-en-france.fr/resultats/13205864-smet-jeanne
#? 7
https://www.deces-en-france.fr/resultats/13205864-smet-jeanne
Née le 07/07/1928
Décédée le 15/08/1999
[9]Épingler cette fiche
Sexe : Femme
Nom : SMET
Prénom(s) : Jeanne
Date de naissance : 07/07/1928
Lieu de naissance : Wahagnies - 59 - France Code Insee 59630
[10]Rejoignez-nous sur Facebook
Date de décès : [11]15/08/1999 (71 ans)
Lieu de décès : Seclin - 59 - France Code Insee 59560
Acte de décès : Numéro 342 - [12]Demander l'acte
#? 12
https://www.deces-en-france.fr/resultats/23666551-smet-jean-philippe-leo
Né le 15/06/1943
Décédé le 05/12/2017
[9]Épingler cette fiche
Sexe : Homme
Nom : SMET
Prénom(s) : Jean Philippe Leo
Date de naissance : 15/06/1943
Lieu de naissance : Paris 9E Arrondissement - 75 - France Code Insee
75109
[10]Rejoignez-nous sur Facebook
Date de décès : [11]05/12/2017 (74 ans)
Lieu de décès : Marnes-la-Coquette - 92 - France Code Insee 92047
Acte de décès : Numéro 12 - [12]Demander l'acte
#? 0
prenom ?jean philippe # ok
variante
~$ lynx -dump "https://www.deces-en-france.fr/resultats?nom=dupont&prenoms=philippe&annee_naissance=&annee_deces=" | awk '/^M/{print; getline; getline; print; getline; print}; /resultat/'
M. DUPONT Philippe
Né le 04/01/1908
Décédé le 25/05/1992
M. DUPONT Philippe
Né le 15/11/1953
Décédé le 14/12/1974
...
Hors ligne
#55 Le 01/02/2022, à 17:10
- Frankkunst
Re : [RESOLU]traitement "chaîne de caratères"
voilà ! tu as, là, tout ton script :
#!/bin/sh
read -r -p 'nom prénom' nom prenom
grep "^$nom.*$prenom" décès-*.txt
Pas mal , au moins c'est sobre
Je vais quand même essayer de soigner la présentation
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#56 Le 01/02/2022, à 17:29
- Tawal
Re : [RESOLU]traitement "chaîne de caratères"
Merci pour l'exemple d'expression "non-gloutonne".
Ça paraît évident une fois sous les yeux, mais je prend note de cette "technique".
Je me suis déjà cassé les pieds contre la gloutonnerie de *.
Merci encore
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#57 Le 01/02/2022, à 17:31
- Frankkunst
Re : [RESOLU]traitement "chaîne de caratères"
pour de simples consultations
:~$ read -p "nom ?" a; read -p "prenom ?" b; read -p "annee naissance ?" c ; read -p "annee deces ?" d; select item in $(lynx -dump "https://www.deces-en-france.fr/resultats?nom=${a}&prenoms=${b}&annee_naissance=${c}&annee_deces=${d}" | awk '/resultat/ && $1>=10 {$1=""; ps[$0]++ }; END {for (p in ps)print p; done}' | sort -V); do [ "$REPLY" -eq 0 ] && break || { echo "$item" ; lynx -dump "$item" | awk '/^\s+Né/,/^\s+Acte de décès/';}; done
Je ne connaissais pas "linx", je viens de l'installer et ai testé ta commande c'est vraiment intéressant !
Bon mais le script que j'ai fait est un peu plus souple d'utilisation, et mon but premier est d'apprendre à coder et de comprendre ce que je fais .
Mais je te remercie bien, je vais pouvoir investir de nouveaux horizons avec ce navigateur linx
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#58 Le 01/02/2022, à 18:39
- Frankkunst
Re : [RESOLU]traitement "chaîne de caratères"
Pour ma part j'ai opté pour
grep "^TARTAN.*LUCIEN" "deces-2020.txt"
qui donne de très bon résultat et permets de entrer le début du nom ainsi que le début d'un prénom, le premier, deuxième ou troisième .
Cette souplesse est un avantage dans ce cas
Merci, bonne soirée à tous
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#59 Le 04/02/2022, à 18:48
- Frankkunst
Re : [RESOLU]traitement "chaîne de caratères"
Bonjour,
Je reviens vers vous car j'ai un petit souci pour supprimer le dernier fichier temporaire du script .
Voici la partie que je désirerais modifier :
for z in $(ls *"$annee$suff")
do
#---------------------------------------* recherche donnée *--------------------------------------------
grep -a "^$nom.*$prenom" "$z" >"$mondoss"/tempDC
#----------------------------------------* tri argument *------------------------------------------------------
n=0 # amorçage compteur de lignes trouvées
while read ligne
do
n=$[ $n+1 ]
ligneX=${ligne##*"*"}; indsexe=${ligne:80:1}; j=${ligne:87:2}; m=${ligne:85:2}; a=${ligne:81:4}; com=${ligne:94:30}
commune=${com%% *}; pays=${ligne:124:30}; pays1=${pays%% *}
if [[ $indsexe -eq 1 ]]; then genre="\tgenre :\033[;;46m homme \033[0m"; else genre="\tgenre :\033[;;42m femme \033[0m"; fi
if [[ ${#pays1} -eq 0 ]]; then paysn=FRANCE; else paysn=$pays; fi
jdc=${ligne:160:2}; mdc=${ligne:158:2}; adc=${ligne:154:4}; lieuxdc=${ligne:162:5}; act=${ligne:167:9}; acte=${act%% *}
grep "$lieuxdc" "$dossier"/commune2021.csv >/dev/null; codesortx=$?
if [[ $codesortx -eq 0 ]]
then codecomdc=$(grep "$lieuxdc" "$dossier"/commune2021.csv); x=1
else codecomdc=$(grep "$lieuxdc" "$dossier"/pays2021.csv); x=2
fi
IFS=","; set -- $codecomdc
if [[ $x -eq 1 ]] ; then cdecl=$8 ; else cdecl=$6 ; fi
echo -n -e "\rNom :"${ligne%%"*"*}"\tPrenom : "${ligneX%%"/"*} $genre"\tDate de naissance : $j/$m/$a\v\rLieu :"${ligne:89:5}
echo -e "\tCommune :$commune\tPays :$paysn\v\rDate de décès :$jdc/$mdc/$adc\tLieux de décès :$lieuxdc $cdecl\tacte n°$acte\v"
done < "$mondoss"/tempDC
tablcpt[${#tablcpt[*]}]=$n
done
cpt=0
for i in ${!tablcpt[*]}; do (( cpt = $cpt+${tablcpt[i]} )); done
Quand je lance le script comme il est, pour rechercher les personnes dénommées DUVAL JEANNE sur la période de 1970 à 2021
J'ai 658 résultats du type :
Nom :DUVAL Prenom : MARCELLE RENEE JEANNE genre : femme Date de naissance : 23/03/1907
Lieu :76351 Commune :LE HAVRE Pays :FRANCE
Date de décès :05/07/1994 Lieux de décès :75111 PARIS 11E ARRONDISSEMENT acte n°503
Nom :DUVAL Prenom : JEANNE MARIE ANTOINETTE MADELEINE genre : femme Date de naissance : 12/05/1913
Lieu :33243 Commune :LIBOURNE Pays :FRANCE
Date de décès :21/12/1994 Lieux de décès :33243 LIBOURNE acte n°1018
Nom :DUVAL Prenom : JEANNE MARIE genre : femme Date de naissance : 13/01/1909
Lieu :22198 Commune :PLEUMEUR-BODOU Pays :FRANCE
Date de décès :12/12/1994 Lieux de décès :22198 PLEUMEUR BODOU acte n°41
Nom :DUVALET Prenom : JEANNE MARTHE LOUISE genre : femme Date de naissance : 19/01/1921
Lieu :08447 Commune :LE THEUX Pays :FRANCE
Date de décès :20/01/1995 Lieux de décès :08105 CHARLEVILLE MEZIERES acte n°79
Nom :DUVALLE Prenom : GABRIELLE JEANNE genre : femme Date de naissance : 14/05/1912
Lieu :80585 Commune :NESLE Pays :FRANCE
Date de décès :02/02/1995 Lieux de décès :80620 PERONNE acte n°27
Nom :DUVAL Prenom : ROLANDE JEANNE LOUISE CLOTILDE genre : femme Date de naissance : 04/10/1911
Lieu :76575 Commune :SAINT-ETIENNE-DU-ROUVRAY Pays :FRANCE
Date de décès :01/03/1995 Lieux de décès :06088 NICE acte n°1059
Nom :DUVAL Prenom : MARTINE FERNANDE JEANNE genre : femme Date de naissance : 17/10/1956
Lieu :88158 Commune :ELOYES Pays :FRANCE
Date de décès :03/03/1995 Lieux de décès :57672 THIONVILLE acte n°194
En passant par mapfile de la façon suivante :
for z in $(ls *"$annee$suff")
do
#---------------------------------------* recherche donnée *--------------------------------------------
mapfile tablresult< <(grep "^$nom.*$prenom" "$z")
#----------------------------------------* tri argument *------------------------------------------------------
n=0 # amorçage compteur de lignes trouvées
for i in ${!tablresult[*]}
do
n=$[ $n+1 ]
ligne=${tablresult[i]}
ligneX=${ligne##*"*"}; indsexe=${ligne:80:1}; j=${ligne:87:2}; m=${ligne:85:2}; a=${ligne:81:4}; com=${ligne:94:30}
commune=${com%% *}; pays=${ligne:124:30}; pays1=${pays%% *}
if [[ $indsexe -eq 1 ]]; then genre="\tgenre :\033[;;46m homme \033[0m"; else genre="\tgenre :\033[;;42m femme \033[0m"; fi
if [[ ${#pays1} -eq 0 ]]; then paysn=FRANCE; else paysn=$pays; fi
jdc=${ligne:160:2}; mdc=${ligne:158:2}; adc=${ligne:154:4}; lieuxdc=${ligne:162:5}; act=${ligne:167:9}; acte=${act%% *}
grep "$lieuxdc" "$dossier"/commune2021.csv >/dev/null; codesortx=$?
if [[ $codesortx -eq 0 ]]
then codecomdc=$(grep "$lieuxdc" "$dossier"/commune2021.csv); x=1
else codecomdc=$(grep "$lieuxdc" "$dossier"/pays2021.csv); x=2
fi
IFS=","; set -- $codecomdc
if [[ $x -eq 1 ]] ; then cdecl=$8 ; else cdecl=$6 ; fi
echo -n -e "\rNom :"${ligne%%"*"*}"\tPrenom : "${ligneX%%"/"*} $genre"\tDate de naissance : $j/$m/$a\v\rLieu :"${ligne:89:5}
echo -e "\tCommune :$commune\tPays :$paysn\v\rDate de décès :$jdc/$mdc/$adc\tLieux de décès :$lieuxdc $cdecl\tacte n°$acte\v"
done
tablcpt[${#tablcpt[*]}]=$n
done
cpt=0
for i in ${!tablcpt[*]}; do (( cpt = $cpt+${tablcpt[i]} )); done
J'ai un retour de 629 résultat avec une erreur de lecture de fichier bin, comme suit :
Nom :DUVAL Prenom : MARCELLE RENEE JEANNE genre : femme Date de naissance : 23/03/1907
Lieu :76351 Commune :LE HAVRE Pays :FRANCE
Date de décès :05/07/1994 Lieux de décès :75111 PARIS 11E ARRONDISSEMENT acte n°503
Nom :DUVAL Prenom : JEANNE MARIE ANTOINETTE MADELEINE genre : femme Date de naissance : 12/05/1913
Lieu :33243 Commune :LIBOURNE Pays :FRANCE
Date de décès :21/12/1994 Lieux de décès :33243 LIBOURNE acte n°1018
Nom :Fichier binaire deces-1995.txt correspondant
Prenom : Fichier binaire deces-1995.txt correspondant
genre : femme Date de naissance : //
Lieu : Commune : Pays :FRANCE
Date de décès :// Lieux de décès : NCC acte n°
Nom :DUVAL Prenom : JEANNE ELISE genre : femme Date de naissance : 29/01/1907
Lieu :51030 Commune :AY Pays :FRANCE
Date de décès :27/11/1995 Lieux de décès :51230 EPERNAY acte n°519
Nom :DUVAL Prenom : MARYVONNE JEANNE genre : femme Date de naissance : 01/02/1930
Lieu :35238 Commune :RENNES Pays :FRANCE
Date de décès :27/11/1995 Lieux de décès :35238 RENNES acte n°2431
L'erreur se situe toujours sur l'année 1995, pourtant quand je contrôle le type de fichier avec file cela donne :
frank@ordiport:~/Data_Deces/fichier_deces$ file -E deces-1997.txt
deces-1997.txt: ASCII text, with CRLF line terminators
frank@ordiport:~/Data_Deces/fichier_deces$ file -E deces-1996.txt
deces-1996.txt: ISO-8859 text, with CRLF line terminators
frank@ordiport:~/Data_Deces/fichier_deces$ file -E deces-1995.txt
deces-1995.txt: ISO-8859 text, with CRLF line terminators
frank@ordiport:~/Data_Deces/fichier_deces$ file -E deces-1994.txt
deces-1994.txt: ASCII text, with CRLF line terminators
frank@ordiport:~/Data_Deces/fichier_deces$ file -E deces-1993.txt
deces-1993.txt: ASCII text, with CRLF line terminators
donc les fichiers sont ok et d’ailleurs j'ai quand même des résultats sur l'année 1995
Là je sèche , y a t'il une protection à mettre quelque part ?
Merci d'avance
Dernière modification par Frankkunst (Le 04/02/2022, à 19:24)
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#60 Le 04/02/2022, à 19:03
- Frankkunst
Re : [RESOLU]traitement "chaîne de caratères"
C'est bon, suis je bête ! J'ai oublié de mettre l'option -a pour grep
mapfile tablresult< <(grep "^$nom.*$prenom" "$z")
Maintenant avec :
mapfile tablresult< <(grep -a "^$nom.*$prenom" "$z")
Cela fonctionne normalement
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne