Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile )
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"

Watael a écrit :

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 wink
Je vais quand même essayer de soigner la présentation lol lol lol


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 smile


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"

LeoMajor a écrit :

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 cool


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 smile


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 ? hmm
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 lol ! 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 wink


C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !

Hors ligne