Pages : 1
#1 Le 03/05/2016, à 10: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, à 11: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 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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, à 11: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, à 11: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, à 11:41)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( 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, à 11:55
- Routard2016
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 ?
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, à 11:57)
Hors ligne
#6 Le 03/05/2016, à 12: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, à 12:35)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#7 Le 03/05/2016, à 12: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, à 17:03)
Hors ligne
#8 Le 03/05/2016, à 12: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, à 12: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, à 15:22)
#10 Le 03/05/2016, à 12: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, à 12:47
- Compte anonymisé
Re : Commande Grep
Oui, enfin j'ai pas ton talent
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, à 13:07
- Routard2016
Re : Commande Grep
Merci à tous pour votre aide, je vais tester tout ça.
Hors ligne
#13 Le 03/05/2016, à 21: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
Pages : 1