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.

#1 Le 03/05/2016, à 11:25

Routard2016

Commande Grep

Bonjour à tous,

Je n'arrive pas à trouver comment avec Grep, trouver une suite de chiffres précise dans un tableur dans n'importe ordre.

Par exemple: Si je cherche grep -n "10,1,2,10"
J'ai bien une ligne avec 10,1,2,10 mais il y a une autres ligne avec 1,10,10,2 qui ne se trouve pas dans le résultat.

Merci pour votre aide.

Hors ligne

#2 Le 03/05/2016, à 12:09

ar barzh paour

Re : Commande Grep

il y aura certainement des réponses meilleures que la mienne qui contient des lignes non concernées mais comme tu ne donnes pas la structure de ton "tableur"

grep -n 1 nom_du_fichier | grep 2 | grep 10

après tu pourras éliminer les lignes non concernées


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

#3 Le 03/05/2016, à 12:15

Routard2016

Re : Commande Grep

J'ai pensé à cette solution mais étant donné que la feuille contient plusieurs milliers de références, je me retrouve avec beaucoup de ligne à éliminer.:(

Hors ligne

#4 Le 03/05/2016, à 12:39

ar barzh paour

Re : Commande Grep

indique plus précisément ce que tu recherches et comment tes données sont structurées
dans ton exemple tu recherches
1,2,10,10
1,10,10,2
1,10,2,10
2,1,10,10
etc ?

Dernière modification par ar barzh paour (Le 03/05/2016, à 12:41)


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

#5 Le 03/05/2016, à 12:55

Routard2016

Re : Commande Grep

ar barzh paour a écrit :

indique plus précisément ce que tu recherches et comment tes données sont structurées
dans ton exemple tu recherches
1,2,10,10
1,10,10,2
1,10,2,10
2,1,10,10
etc ?

C'est bien ça, sauf qu'il me renvoi juste la première ligne.
A savoir, 10,1,2,10 mais pas les autres.
La liste de référence se trouve dans la même colonne et je cherche les doublons dans le désordre.

Dernière modification par Routard2016 (Le 03/05/2016, à 12:57)

Hors ligne

#6 Le 03/05/2016, à 13:12

melixgaro

Re : Commande Grep

salut,
à part écrire plus ou moins explicitement les 24 permutations possibles (dans le cas général où les 4 nombres sont différents), je ne vois pas trop. l'écriture des permutations peut sans doute s'automatiser.

Dernière modification par melixgaro (Le 03/05/2016, à 13:35)


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#7 Le 03/05/2016, à 13:24

pingouinux

Re : Commande Grep

Bonjour,
Essaye ceci

while read lig
do
   n1=$(grep -wo 1 <<<"$lig"|wc -l)
   n2=$(grep -wo 2 <<<"$lig"|wc -l)
   n10=$(grep -wo 10 <<<"$lig"|wc -l)
   (( n1==1 && n2==1 && n10==2 )) && echo "$lig"
done <fichier

Édité : Simplification du script

while read lig
do
   [[ $(grep -wo  1 <<<"$lig"|wc -l) = 1 ]] || continue
   [[ $(grep -wo  2 <<<"$lig"|wc -l) = 1 ]] || continue
   [[ $(grep -wo 10 <<<"$lig"|wc -l) = 2 ]] || continue
   echo "$lig"
done <fichier

Dernière modification par pingouinux (Le 03/05/2016, à 18:03)

Hors ligne

#8 Le 03/05/2016, à 13:31

melixgaro

Re : Commande Grep

à pingouinux
je ne sais pas si on peut se baser sur les valeurs données. dans le premier message, la personne parle d'un exemple… Il faudra que Routard2016 précise si c'est bien le (seul) jeu de valeurs avec lequel il/elle va travailler.


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#9 Le 03/05/2016, à 13:31

Compte anonymisé

Re : Commande Grep

Bonjour,

je vous propose de d'abord trier par ordre la ligne à chercher pour éviter de chercher toutes les permutations possibles.

#!/bin/bash
j=1
fichier=nom_de_fichier
recherche=$(printf "10,1,2,10"|tr "," "\n"|sort -n|tr "\n" ",")
while read i
  do printf "$i"|tr "," "\n"|sort -n|tr "\n" ","|grep "$recherche" > /dev/null&&echo "$j $i"
  j=$((j+1))
done < $fichier

le code n'est pas optimal mais à l'air de fonctionner.

EDIT : corrections

Dernière modification par Compte anonymisé (Le 03/05/2016, à 16:22)

#10 Le 03/05/2016, à 13:43

pingouinux

Re : Commande Grep

@melixgaro #8 : En effet, j'indique juste le principe, et il faudra sans doute adapter la méthode. La proposition d'Anonyme68 en #9 est aussi une approche intéressante.

Hors ligne

#11 Le 03/05/2016, à 13:47

Compte anonymisé

Re : Commande Grep

Oui, enfin j'ai pas ton talent smile

j'avais vu dans la première commande qu'il y avait "grep -n", j'ai donc supposé que Routard2016 voulait aussi le numéro de ligne.

#12 Le 03/05/2016, à 14:07

Routard2016

Re : Commande Grep

Merci à tous pour votre aide, je vais tester tout ça.

Hors ligne

#13 Le 03/05/2016, à 22:14

pingouinux

Re : Commande Grep

En reprenant l'idée d'Anonyme68 #9, et en ajoutant une fonction pour trier chaque ligne :

#!/bin/bash

tri() { echo "$(IFS=", " read -a lig <<<"$@"; printf "%s\n" "${lig[@]}"|sort)"; }
nums="  10 ,1, 2, 10"

j=1
fichier=nom_de_fichier
recherche=$(tri $nums)
while read i
do
     i_sort=$(tri $i)
     [[ $recherche == $i_sort ]] && echo "$j $i"
     ((j++))
done <"$fichier"

Ma méthode en #7 avait l'inconvénient d'obliger à décortiquer à la main la ligne cherchée. Ici, on pourrait même la passer en paramètre du script.

Hors ligne