Grep sur fichier volumineux
Résolu/Fermé
A voir également:
- Grep sur fichier volumineux
- Fichier rar - Guide
- Comment réduire un fichier trop volumineux - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier iso - Guide
16 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 18:30
22 avril 2009 à 18:30
Salut,
Tu peux afficher :
Tu peux afficher :
grep --version grep --helpSinon avec "sed" :
sed -n '/motif/p;q' fichier;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 18:59
22 avril 2009 à 18:59
C'est bizarre ça ;-\
Et comme ça :
Et comme ça :
sed -n '/MOTIF/{p;};q' File???
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 19:04
22 avril 2009 à 19:04
On peut avoir un bout de ton fichier et le motif à chercher please ?
bout du fichier :
21621623335704|17|
21621623336802|17|
21621623351963|17|
21621623357067|17|
21621623373862|17|
21621623376968|17|
21621623390324|17|
21621623391903|17|
21622010039|14|
21622010077|16|
21622010191|36|
21622010275|16|
21622010352|16|
21622010405|18|
21622010547|14|
21622010664|37|
21622010692|17|
21622010709|36|
21622010720|17|
21622010737|17|
21622010822|37|
21622010944|36|
21622011017|14|
le motif à chercher : 21622010039 par exemple.
mon fichier contient 5366202 lignes. donc la recherche complete du fichier prend bcp de temps.
21621623335704|17|
21621623336802|17|
21621623351963|17|
21621623357067|17|
21621623373862|17|
21621623376968|17|
21621623390324|17|
21621623391903|17|
21622010039|14|
21622010077|16|
21622010191|36|
21622010275|16|
21622010352|16|
21622010405|18|
21622010547|14|
21622010664|37|
21622010692|17|
21622010709|36|
21622010720|17|
21622010737|17|
21622010822|37|
21622010944|36|
21622011017|14|
le motif à chercher : 21622010039 par exemple.
mon fichier contient 5366202 lignes. donc la recherche complete du fichier prend bcp de temps.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 19:29
22 avril 2009 à 19:29
Je t'avoue que je ne comprends plus ;-(((
Avec ton exemple de fichier, effectivement il ne me renvoie rien avec "p;q" :
Il me renvoie bien la ligne sans le "q" :
Par contre sur un autre fichier la commande "p;q" marche bien :
Désolé ;-(
Avec ton exemple de fichier, effectivement il ne me renvoie rien avec "p;q" :
[tmpfs]$ sed -n '/21622010039/p;q' plop [tmpfs]$
Il me renvoie bien la ligne sans le "q" :
[tmpfs]$ sed -n '/21622010039/p' plop 21622010039|14|
Par contre sur un autre fichier la commande "p;q" marche bien :
[tmpfs]$ cat list.db toto 0123456789 tata 0555555555 titi 0677775555 tutu 0123456789 tete 0123456789 bobo 0555555555 baba 0987654321 bibi 0555555555 bubu 0123456789 [tmpfs]$ sed -n '/01/p;q' list.db toto 0123456789 [tmpfs]$Je ne comprends pas ;-(((((
Désolé ;-(
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 20:00
22 avril 2009 à 20:00
Effectivement avec une autre ligne que la 1ère ça marche plus ;-\
Bon on va creuser le sujet ;-))
Bon on va creuser le sujet ;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
22 avril 2009 à 20:32
22 avril 2009 à 20:32
Salut,
Avec perl (j'ai fait un doublon pour tester - voir en gras)
Avec perl (j'ai fait un doublon pour tester - voir en gras)
$ cat base 21621623335704|17| 21621623336802|17| 21621623351963|17| 21621623357067|17| 21621623373862|17| 21621623376968|17| 21621623390324|17| 21621623391903|17| 21622010039|14| 21622010039|14| 21622010077|16| 21622010191|36| 21622010275|16| 21622010352|16| 21622010405|18| 21622010547|14| 21622010664|37| 21622010692|17| 21622010709|36| 21622010720|17| 21622010737|17| 21622010822|37| 21622010944|36| 21622011017|14| $ perl -ne 'next unless /^(21622010039)/;print "ligne $. => $1\n"' base ligne 9 => 21622010039 ligne 10 => 21622010039 $ perl -ne 'next unless /^(21622010039)/;print "ligne $. => $1\n" and exit' base ligne 9 => 21622010039
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 20:39
22 avril 2009 à 20:39
Salut lami20j,
J'étais à 2 doigts de te demander une solution en Perl car apparemment avec "sed" ce n'est pas possible directement, à moins d'user de moulinettes contre productive ;-((
Merci ;-)
Sinon avec sed il faudrait connaitre au moins le contenu de la ligne suivante pour faire un truc du genre :
PS. Dommage quand même que le "grep -m 1" ne marche pas :
J'étais à 2 doigts de te demander une solution en Perl car apparemment avec "sed" ce n'est pas possible directement, à moins d'user de moulinettes contre productive ;-((
Merci ;-)
Sinon avec sed il faudrait connaitre au moins le contenu de la ligne suivante pour faire un truc du genre :
$ sed -n '/21622010077/q;/21622010039/p' plop 21622010039|14|Avec ça ça marche ;-))
PS. Dommage quand même que le "grep -m 1" ne marche pas :
$ grep -m 1 '21622010039' plop 21622010039|14|;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
22 avril 2009 à 21:09
22 avril 2009 à 21:09
Salut jipicy ;-)
De rien ;-))
De rien ;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
22 avril 2009 à 21:08
22 avril 2009 à 21:08
Re,
Et comme ça?!
Et comme ça?!
$ cat base 21621623335704|17| 21621623336802|17| 21621623351963|17| 21621623357067|17| 21621623373862|17| 21621623376968|17| 21621623390324|17| 21621623391903|17| 21622010039|14| 21622010039|14| 21622010077|16| 21622010191|36| 21622010275|16| 21622010352|16| 21622010405|18| 21622010547|14| 21622010664|37| 21622010692|17| 21622010709|36| 21622010720|17| 21622010737|17| 21622010822|37| 21622010944|36| 21622011017|14| $ while read ligne;do echo $ligne|grep 21622010039 && break;done <base 21622010039|14|
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
23 avril 2009 à 09:31
23 avril 2009 à 09:31
Salut,
Avec shell + grep
En perl
Avec shell + grep
while read ligne;do echo $ligne|grep -o 21622010039 && break;done <base
En perl
perl -ne 'next unless /^(21622010039)/;print "$1\n" and exit' base
dubcek
Messages postés
18752
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
3 octobre 2024
5 619
23 avril 2009 à 09:34
23 avril 2009 à 09:34
hello
et avec awk
awk '/21622010039/ {print $0;exit} < fichier
et avec awk
awk '/21622010039/ {print $0;exit} < fichier
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
23 avril 2009 à 09:38
23 avril 2009 à 09:38
Salut,
T'as pas oublié un apostrophe ? ;-)
T'as pas oublié un apostrophe ? ;-)
userette
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
23 avril 2009 à 09:43
23 avril 2009 à 09:43
lami20j c'est encore moi. désolée d'être aussi pressante mais c pour un truc urgent.
en fait, avec ta commande perl, je n'extrais que le motif. moi je voudrais toute la phrase.
t'aurais pas une idée !!
en fait, avec ta commande perl, je n'extrais que le motif. moi je voudrais toute la phrase.
t'aurais pas une idée !!
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
userette
23 avril 2009 à 09:55
23 avril 2009 à 09:55
Re,
Essaie
106485010510997108
Essaie
perl -ne 'next unless /^21622010039/;print and exit' base--
106485010510997108
userette
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
23 avril 2009 à 10:58
23 avril 2009 à 10:58
ok ça marche mnt sauf que si je mets ma commande dans un script :
la commande marche mais ça me sort toujours la 1ere ligne du fichier base
base :
msisdn.txt :
bizarre !!!
cat msisdn.txt | while read MSISDN do echo $MSISDN result=`perl -ne 'next unless /^$MSISDN/;print and exit' base` echo $result done
la commande marche mais ça me sort toujours la 1ere ligne du fichier base
base :
21622010039|14| 21622010077|16| 21622010191|36| 21622010275|16| 21622010352|16| 21622010405|18| 21622010547|14| 21622010664|37| 21622010692|17| 21622010709|36| 21622010720|17|
msisdn.txt :
21622010405 21622010664
bizarre !!!
dubcek
Messages postés
18752
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
3 octobre 2024
5 619
23 avril 2009 à 09:41
23 avril 2009 à 09:41
effectivement
awk '/21622010039/ {print $0;exit}' < fichier
awk '/21622010039/ {print $0;exit}' < fichier
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
23 avril 2009 à 11:12
23 avril 2009 à 11:12
Re,
Mais je ne comprends pas ce que tu veux.
Comment ça la 1ère ligne?!
Il faut que tu exécutes le script est affiche ici le résultat.
Il faudra aussi que tu affiches ce que tu veux obtenir.
En réalité, tu as posé une question pour un cas particulier, mais il s'avère que le problème doit être traiter de façon globale.
On attends tes explications.
for MSISDN in $(cat msisdn.txt) do echo $MSISDN result=$(perl -ne 'next unless /^$MSISDN/;print and exit' base) echo $result done
Mais je ne comprends pas ce que tu veux.
Comment ça la 1ère ligne?!
Il faut que tu exécutes le script est affiche ici le résultat.
Il faudra aussi que tu affiches ce que tu veux obtenir.
En réalité, tu as posé une question pour un cas particulier, mais il s'avère que le problème doit être traiter de façon globale.
On attends tes explications.
ok. j'ai essayé le code que tu as mis. mais j'ai toujours le même résultat non attendu, à savoir :
==> la commande renvoie toujours la 1ere ligne du fichier base
alors que je veux avoir :
==> extraire les 1eres lignes relatives aux motifs que je recherche.
any idea please ?
merci
21622010405 21622010039|14| 21622010664 21622010039|14|
==> la commande renvoie toujours la 1ere ligne du fichier base
alors que je veux avoir :
21622010405 21622010405|18| 21622010664 21622010664|37|
==> extraire les 1eres lignes relatives aux motifs que je recherche.
any idea please ?
merci
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
23 avril 2009 à 11:36
23 avril 2009 à 11:36
Re,
Tu testes quoi en fait? L'affichage de ton résultat ne suffit pas.
Affiche le résultar de
Tu testes quoi en fait? L'affichage de ton résultat ne suffit pas.
Affiche le résultar de
for MSISDN in $(cat msisdn.txt);do echo $MSISDN;done
ok ça fonctionne mnt. j'ai juste remplacer les ' par les ". et bizarre ça marche mnt.
le pb c'est que la recherche est tjrs aussi lente.
je vais esaayer d'optimiser
le pb c'est que la recherche est tjrs aussi lente.
je vais esaayer d'optimiser
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
23 avril 2009 à 13:33
23 avril 2009 à 13:33
Re,
Il peut avoir un conflit entre une variable shell et perl (je n'ai pas moyens de tester)
Essaie plutôt (je n'ai pas testé)
Il peut avoir un conflit entre une variable shell et perl (je n'ai pas moyens de tester)
Essaie plutôt (je n'ai pas testé)
for MSISDN in $(cat msisdn.txt) do echo $MSISDN while read ligne do echo $ligne|grep $MSISDN && break done < base done
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
23 avril 2009 à 14:46
23 avril 2009 à 14:46
Dis-moi userette, tu peux essayer ça :
sed '/21622010039/!d;q' fichiers'il te plait ;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
userette
23 avril 2009 à 15:51
23 avril 2009 à 15:51
Encore une bizarrerie ;-((
Essaie :
Essaie :
sed '/21622010039.*$/!d;q'
userette
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
23 avril 2009 à 18:03
23 avril 2009 à 18:03
finalement,
j'ai utilisé
ça marche.
merci à toi jipicy.
merci à tous :))))
j'ai utilisé
`perl -ne "next unless /^$chaine/;print and exit" base >> output.txt`
ça marche.
merci à toi jipicy.
merci à tous :))))
22 avril 2009 à 18:50
j'ai essayé avec sed.
ça me renvoie pas d'erreur sauf que ça ne me renvoie rien du tt.
sed -n '/MOTIF/p;q' File
alors que si je fais sed -n '/MOTIF/p' File --> ça me renvoie une ligne.
aurais-tu une idée? est ce qu'il faut forcer l'affichage?