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.

#26 Le 11/03/2013, à 19:19

ar barzh paour

Re : [Résolu] choix pour des recherches dans des fichiers

grep ou awk j'hésite encore !!!!!
j'ai commencé à regarder les expressions régulières
dans certains cas un grep est très simple
awk à l'air plus simple pour analyser les champs


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#27 Le 11/03/2013, à 19:22

tiramiseb

Re : [Résolu] choix pour des recherches dans des fichiers

Oui, clairement si tu veux *analyser* avec awk tu peux tout faire en un seul appel de commande.
En même temps awk c'est un langage à lui tout seul alors que les autres c'est des outils qui ont des rôles précis et limités.

Hors ligne

#28 Le 13/03/2013, à 19:49

ar barzh paour

Re : [Résolu] choix pour des recherches dans des fichiers

bon voilà je me suis créé 4 shell tous simples , encore perfectibles ,il y a encore quelques erreurs
je peux peut-être simplifié en utilisant {m} dans les expressions mais je trouve que ça tourne pas trop mal , avec un gain de temps de recherche énorme !!!! , pour une analyse plus fine des expressions je pense que je me tournerais vers awk
je marque Résolu dans le titre
donne le lignes dont le champ "n" commence par "mot" : sh_n_com "$mot" $"n"
le shell :   ( remarque les commentaires 1 2 3 4 5 6 7 8 9 n'apparaissent pas à leur bonne place )

#!/bin/bash
echo "paramètres recus dans $0 : " $@
 #	"syntaxe <nom du shell> <"chaine"> <num>"

# $1 est le début de mot à rechercher doit être différent de * ou de  (  ou de [  ou de !!!!
# résolution de quelques anamolies de recherche si le mot contient ( [ ] )  et ... d'autres à voir

tmp1=`echo "$1" | sed 's/\[/\\\[/'`		# remplace [ par \[		:s /	\[	/	\\\[	/
tmp2=`echo "$tmp1" | sed 's/(/\\\(/'`	# remplace ( par \(		:s/	(	/	\\\(	/
tmp3=`echo "$tmp2" | sed 's/)/\\\)/'`	# remplace ) par \)		:s/	)	/	\\\)	/
var=$tmp3
#	reste à résoudre les accents é ñ è ç etc
echo

if [[ -z $var ]] 
then
	echo "paramètre de recherche vide"
	read g
	exit 0
fi

fich=./dico.txt
#bre(1);0;fra(3);type(4);plu_rad(5);pl](6);[pron](7);x2(8);m],f](9);reste(10)

echo " champ commençant  $var         dans le $2 ème champ"


#	$2 est le numéro du champ dans lequel rechercher
case $2 in
	0 | 1 )
		#                            1     2     3      4     5     6      7     8     9
		grep -iE "^$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	2)
		#                      1               2      3       4      5      6       7      8      9
		grep -iE "^[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	3)
		#                      1       2              3       4      5      6       7      8      9
		grep -iE "^[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
		
	;;
	4)
		#                     1       2      3               4      5      6       7      8       9
		grep -iE "^[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	5)
		#                      1       2      3       4              5      6       7      8      9
		grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	6)
		#                      1       2      3       4      5              6       7      8      9
		grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	7)
		#                      1       2      3       4      5       6             7      8      9
		grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	8)
		#                      1       2      3       4      5       6      7              8      9
		grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*;[^;]*" $fich
	;;
	9)
		#                     1       2      3       4      5       6      7       8              9
		grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var[^;]*;[^;]*" $fich
	;;
	10)
		#                     1       2      3       4      5       6      7       8      9
		grep -iE "^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;$var" $fich
	;;
	*)
		echo "syntaxe incorrecte  $0    \"chaine\"      num"
		echo " avec num = 0 1 2 3 4 5 6 7 8 9 ou 10"
	;;
esac

echo "fin de recherche"
read g

donne les lignes dont le champ "n" finit par "mot" : sh_n_fin "$mot" $"n"
le shell :

#!/bin/bash
echo "paramètres recus dans $0 : " $@
 #	"syntaxe <nom du shell> <"chaine"> <num>"

#var=$1 # c'est la fin du mot à rechercher doit être différent de * ou de  (  ou de [  ou de !!!!
#                                        ] marche
tmp1=`echo "$1" | sed 's/\[/\\\[/'`		# remplace [ par \[		:s /	\[	/	\\\[	/
tmp2=`echo "$tmp1" | sed 's/(/\\\(/'`	# remplace ( par \(		:s/	(	/	\\\(	/
tmp3=`echo "$tmp2" | sed 's/)/\\\)/'`	# remplace ) par \)		:s/	)	/	\\\)	/

var=$tmp3



echo

if [[ -z $var ]] 
then
	echo "paramètre de recherche vide"
	read g
	exit 0
fi

fich=./dico.txt
#bre(1);0;fra(3);type(4);plu_rad(5);pl](6);[pron](7);x2(8);m],f](9);reste(10)

echo " champ finissant par  $var         dans le $2 ème champ"


#	$2 est le numéro du champ dans lequel rechercher
case $2 in
	0)	# dans la ligne
		grep -iE $var$ $fich
	;;
	1)	# dans le champ 1
		#                              1      2      3       4      5      6       7      8      9
		grep -iE "[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	2)	# dans le champ 2
		#                    1              2      3       4      5      6       7      8      9
		grep -iE "[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	3)	# dans le champ 3
		#                    1       2              3       4      5      6       7      8      9
		grep -iE "[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
		
	;;
	4)
		#                    1       2      3              4      5      6       7      8      9
		grep -iE "[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	5)
		#                    1       2      3       4             5      6       7      8      9
		grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	6)
		#                    1       2      3       4      5              6       7      8      9
		grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*;[^;]*" $fich
	;;
	7)
		#                    1       2      3       4      5       6             7      8      9
		grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*;[^;]*" $fich
	;;
	8)
		#                    1       2      3       4      5       6      7              8      9
		grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*;[^;]*" $fich
	;;
	9)
		#                    1       2      3       4      5       6      7       8             9
		grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var;[^;]*" $fich
	;;
	10)
		#                    1       2      3       4      5       6      7       8      9
		grep -iE "[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*$var$" $fich
	;;
	*)
		echo "syntaxe incorrecte  $0    \"chaine\"      num"
		echo " avec num = 0 1 2 3 4 5 6 7 8 9 ou 10"
	;;
esac

echo "fin de recherche"
read g

j'ai deux autres shell du même tabac
SH_n_exact présence exactement du "mot" dans le champ n et
SH_n_cont : le champ n contient le mot

si vous avez encore quelques conseils je suis preneur

Dernière modification par ar barzh paour (Le 13/03/2013, à 19:56)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#29 Le 13/03/2013, à 20:23

tiramiseb

Re : [Résolu] choix pour des recherches dans des fichiers

si vous avez encore quelques conseils je suis preneur

Pour tes "grep", je pense que tous les ";[^;]*" après $var et jusqu'à la fin sont inutiles (sauf si tu veux valider que la ligne a 9 champs).

Par ailleurs, "[^;]*$var;" ne marchera que si ce que tu cherches est à la fin du champ. Si tu veux que ton élément de recherche puisse être trouvé n'importe où dans le champ, il faut mettre : "[^;]*$var[^;]*;"

Hors ligne

#30 Le 13/03/2013, à 21:23

Totor

Re : [Résolu] choix pour des recherches dans des fichiers

tiramiseb a écrit :
credenhill a écrit :
var=EneP; awk -F";" -v var=$var 'BEGIN{IGNORECASE=1} $1 ~ var {print}' dico.txti

C'est un peu plus compliqué que

grep "^$var;" dico.txt

big_smile

Awk est tout aussi puissant (voire plus) que grep pour la recherche de pattern/regex. En outre, je rejoins largement credenhill sur son utilisation car il est doté d'un langage lui permettant de réaliser des traitements sur des flux évitant de multiples utilisations de grep (ou sed) à l'interieur des divers mechanismes de boucles fournis par le shell employé.
Dès lors que l'on a compris son fonctionnement, cela permet une plus grande souplesse dans les traitements de flux.


-- Lucid Lynx --

Hors ligne

#31 Le 13/03/2013, à 21:38

tiramiseb

Re : [Résolu] choix pour des recherches dans des fichiers

Oui, "dès lors que l'on a compris son fonctionnement"... En 15 ans je n'ai toujours pas compris son fonctionnement lol

Hors ligne

#32 Le 14/03/2013, à 08:52

ar barzh paour

Re : [Résolu] choix pour des recherches dans des fichiers

tiramiseb a écrit :

Pour tes "grep", je pense que tous les ";[^;]*" après $var et jusqu'à la fin sont inutiles

peut-être , dans le doute j'ai explicité jusqu'à la fin , j'y reviendrai peut-être

tiramiseb a écrit :

Par ailleurs, "[^;]*$var;" ne marchera que si ce que tu cherches est à la fin du champ. Si tu veux que ton élément de recherche puisse être trouvé n'importe où dans le champ, il faut mettre : "[^;]*$var[^;]*;"

oui c'est voulu
"[^;]*$var;" ==> se trouve dans SH_n_fin (contient $var;    sauf pour le champ 10 où j'ai mis $var$
"[^;]*$var[^;]*;" ==> se trouve dans SH_n_cont (contient $var)

Totor a écrit :

Awk est tout aussi puissant (voire plus) que grep pour la recherche de pattern/regex

c'est vrai , je pense , mais il me faudra plus de temps pour le mettre en oeuvre , par contre , il sera plus souple pour les analyses plus fines que je veux réaliser


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#33 Le 14/03/2013, à 09:34

pingouinux

Re : [Résolu] choix pour des recherches dans des fichiers

@ar barzh paour :

Dans ton premier script en #28, tu peux remplacer la longue structure case … esac par ceci

#       $2 est le numéro du champ dans lequel rechercher
n=$2
if (( n>=0 && n<=10 ));
then
    while read lig
    do
        IFS=";" liste=( $lig )
        egrep -q "^$var" <<<"${liste[$((n-1))]}" && echo "$lig"
    done <"$fich"
else
    echo "syntaxe incorrecte  $0    \"chaine\"      num"
    echo " avec num = 0 1 2 3 4 5 6 7 8 9 ou 10"
fi

Ajouté :
Tu peux aussi remplacer la séquence

tmp1=…
tmp2=…
tmp3=…
var=…

par

var=$( sed -r 's/(\[|\(|\))/\\\1/' <<<"$1" )

ou, s'il peut y avoir plusieurs occurrences à remplacer

var=$( sed -r 's/(\[|\(|\))/\\\1/g' <<<"$1" )

Dernière modification par pingouinux (Le 14/03/2013, à 17:11)

Hors ligne