Grep caractère joker "dans les deux sens"

Fermé
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013 - 18 févr. 2013 à 09:52
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 - 20 févr. 2013 à 14:46
Bonjour,

Je débute en shell et j'ai un petit problème avec la fonction grep.

Je recherche les ligne d'un fichier qui contiennent 11 22 11 .. 22 par exemple avec la fonction grep.
Le fichier contient par exemple :
11 .. 11 11 22
11 22 .. 22 22
11 11 11 11 22
11 22 11 11 22
.. 22 11 22 22

Je voudrais donc qu'il me sortent toutes les lignes qui sont égales au .. près c'est à dire :
11 .. 11 11 22
11 22 .. 22 22
11 22 11 11 22
.. 22 11 22 22

Mais visiblement le . dans le fichier où est fait la recherche n'est pas considéré comme un caractère joker et la seule ligne qu'il me sort est :
11 22 11 11 22

Est-il possible d'interpréter un symbole comme universel dans le fichier où ce fait la recherche ?
Que ce soit avec grep ou autrement !

J'ai essayer de vérifier l'égalité terme à terme mais mon fichier est trop gros et ça dure des plombes.

Merci d'avance
A voir également:

6 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
18 févr. 2013 à 10:27
Salut,

Ton explication n'est pas très explicite ;-\

Il semblerait qu'en fonction du résultat souhaité (contrairement à ton explication), ceci devrait faire l'affaire :
$ cat plop 
11 .. 11 11 22
11 22 .. 22 22
11 11 11 11 22
11 22 11 11 22
.. 22 11 22 22

$ grep '11 .. 22' plop 
11 .. 11 11 22
11 11 11 11 22
11 22 11 11 22
.. 22 11 22 22

$

0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
Modifié par Aguila1003 le 18/02/2013 à 10:50
Ce n'est pas exactement ça que je veux faire.
Par exemple :

J'ai un fichier test2.csv qui contient
11,11,11,11,..,22,22,22
11,11,11,11,11,..,..,22
11,11,11,11,22,..,..,22

$ grep '11,11,11,11,..,22,22,22' test2.csv  
11,11,11,11,..,22,22,22  


Alors que moi j'aimerais qu'il me sorte les trois.

En fait mes fichiers sont beaucoup plus long et je cherche des lignes complètes qui sont identiques pour chaque terme aux données manquantes près.
Je ne peux donc pas me contenter de faire un grep de ce qui est identique dans ces trois lignes parce que sur un fichier plus long ils me renverrait aussi des lignes qui ont des termes différents.
Les données manquantes sont les ..
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
18 févr. 2013 à 10:47
Il ne pourra pas te sortir les 3, et peu importe le shell, dans la mesure où UN seul motif correspond à ta regex ;-(
0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
18 févr. 2013 à 11:42
Mais il n'y a pas moyen de faire en sorte que les points du fichier sur lequel est fait la recherche soit aussi considéré comme des caractères quelconques ?
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
18 févr. 2013 à 11:32
hello
et quelque chose comme ça ?
$ grep -E '(11,)*[,.]*(,22)*$' test2.csv
11,11,11,11,..,22,22,22
11,11,11,11,11,..,..,22
11,11,11,11,22,..,..,22
$ 
0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
18 févr. 2013 à 11:44
Pas vraiment puisque je pourrais aussi avoir un
11,11,11,22,11,22,22,22 que je ne veux pas mais qui correspondrait à la formule.

De plus je veux pouvoir généraliser le motif grep à n'importe quelle ligne
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
18 févr. 2013 à 12:01
quelle formule ? les premiers champs contiennent 11, les derniers 22 et entre que des points ?
0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
18 févr. 2013 à 12:50
Je veux dire que ça ne correspondrait pas à 11,11,11,11,..,22,22,22, ce à quoi je veux que ça corresponde
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
18 févr. 2013 à 16:16
désolé, je ne comprends pas
0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
18 févr. 2013 à 16:50
Merci quand même ;)
C'est de ma faute, en voulant simplifier j'ai pas bien expliquer

Je vais essayer de réexpliquer en mettant plus de lignes.
J'ai ce fichier :

11,11,11,11,..,22,22,22
11,11,11,11,11,..,..,22
11,11,11,11,22,..,..,22
11,11,11,11,11,11,..,22
11,11,11,11,11,..,11,22

Et je veux les lignes qui sont égales à la premières au points près c'est à dire les 3 premières mais pas les deux dernières qui ont des 11 là où dans la première il y a des 22.

Grep ne considère les points comme universels que dans l'expression à rechercher (ici la première ligne), pas dans le fichier où il cherche cette expression donc je ne peux pas l'utiliser il me semble
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
18 févr. 2013 à 11:56
Et comme ça :
$ cat plop 
11,11,11,11,..,22,22,22
11,11,11,11,11,..,..,22
11,11,11,11,22,..,..,22
11,11,11,22,11,22,22,22

$ egrep '(11,){4}(..,|22,){3}22' plop 
11,11,11,11,..,22,22,22
11,11,11,11,11,..,..,22
11,11,11,11,22,..,..,22

$ 

0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
18 févr. 2013 à 12:51
ça ne va pas parce que je ne peux pas le généraliser avec un fichier où j'aurais plein de ligne et où je voudrait qu'il ne me sorte que celles qui correspondent à la premières lignes aux données manquantes (..) près.
0
Utilisateur anonyme
19 févr. 2013 à 12:31
salut,

une partie de la première ligne doit servir de motif pour afficher les lignes suivantes (ainsi que la première qui correspond nécessairement) qui correspondent (au motif).

quelle partie ? pourquoi ?

«aux données près», «aux points près», ne sont pas des descriptions suffisamment précises.
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
19 févr. 2013 à 12:42
0
Utilisateur anonyme
19 févr. 2013 à 12:54
heu...
je veux les lignes qui sont égales à la premières au points près
non :(
pas plus précis.
0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
19 févr. 2013 à 13:10
Bon je vais essayer d'être plus explicite :
Je veux une égalité terme à terme des 2 lignes, les points étant des jockers.
C'est à dire soit les termes (qui sont séparés par des virgules) sont égaux, soit au moins un des deux est constitué de points.
C'est plus clair ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
19 févr. 2013 à 14:39
est ce que je résume juste ?
toutes les lignes dont les N premiers champs sont les mêmes que les N premiers champs de la ligne 1 ou égaux à 2 points et dont les N derniers champs sont les mêmes que les N derniers champs de la ligne 1 ou égaux à 2 points, sachant que le nombre de champs est 8
0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
19 févr. 2013 à 15:20
Presque. C'est juste que N = 8

C'est à dire :
toutes les lignes dont tous champs sont les mêmes que les champs de la ligne 1 ou égaux à 2 points
0
Aguila1003 Messages postés 11 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 19 février 2013
19 févr. 2013 à 15:49
Et j'oubliais :
En fait c'est plutôt :

toutes les lignes dont tous champs sont les mêmes que les champs de la ligne 1 ou égaux à 2 points ou que le champs correspondant de la ligne 1 soit égal à 2 points

Sinon avec un grep ce serait facile
0
dubcek Messages postés 18752 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 3 octobre 2024 5 619
20 févr. 2013 à 14:46
essayer
$ cat fichier
11,11,11,11,..,22,22,22
11,11,11,11,11,..,..,22
11,11,11,11,22,..,..,22
11,11,11,11,11,11,..,22
11,11,11,11,11,..,11,22
$ 
$ awk -F, 'NR<2 {split($0, l1); print; next} {z=0; for(n=1; n<=NF; n++)if($n==l1[n] || l1[n]==".." || $n=="..")z++} z==NF' fichier 
11,11,11,11,..,22,22,22
11,11,11,11,11,..,..,22
11,11,11,11,22,..,..,22
$ 
0