Rechercher : dans
Par :

Grep sur fichier volumineux

Dernière réponse le 23 avr 2009 à 18:03:53 userette, le 22 avr 2009 à 18:16:20 
 Signaler ce message aux modérateurs

Bonjour,
J'ai un fichier très volumineux à parcours.
Je voudrais que ma commande grep sorte à la première occurrence trouvée.
Sinon mon script mettrait des jours à se terminer puisque qu'il parcourt à chaque grep touuuuut le fichier.

je sais qu'il y a l'option grep -m NUMBER
mais elle est pas reconnue sur ma machine. peut etre ancienne version.



SVP aidez moi. je bloque la-dessous.

Configuration: Unix
Firefox 3.0.9

Meilleures réponses pour « grep sur fichier volumineux » dans :
Envoyer des fichiers volumineux par mail VoirEnvoyer de gros fichiers à des amis par courrier électronique n'est pas toujours facile. La plupart des serveurs de messagerie n'acceptent pas des fichiers de taille supérieure à 5 Mo. Néanmoins, il existe des solutions alternatives : Les serveurs...
Télécharger Vista Shutdown Timer VoirQuand vous téléchargez un fichier volumineux ou quand une installation ou un transfert tarde à se terminer ! Comment faire pour ne pas être obligé d'attendre la fin de la tâche ? VistaShutDownTimer est un programme permettant de définir l'heure...
Télécharger Pando VoirQuoi de plus énervant que d'envoyer des fichiers volumineux par mail! La solution à vos problèmes se tient en cinq lettres : "Pando". Pando est l'outil idéal pour le transfert de données de grand volume via un mail. Il permet d'envoyer des fichiers...

1

jipicy, le 22 avr 2009 à 18:30:19

Salut,

Tu peux afficher :

grep --version
grep --help
Sinon avec "sed" :
sed -n '/motif/p;q' fichier
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

2

userette, le 22 avr 2009 à 18:50:42

Merci pour ta réponse.
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?

Répondre à userette

3

jipicy, le 22 avr 2009 à 18:59:02

C'est bizarre ça ;-\

Et comme ça :

sed -n '/MOTIF/{p;};q' File 
???
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

4

userette, le 22 avr 2009 à 19:02:34

Oui ça marche mais ça parcoure qd meme tout le fichier :(
t'aurais pas une autre idée stp ?

je bloque :(

Répondre à userette

5

jipicy, le 22 avr 2009 à 19:04:17

On peut avoir un bout de ton fichier et le motif à chercher please ?
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

6

userette, le 22 avr 2009 à 19:09:45

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.

Répondre à userette

7

jipicy, le 22 avr 2009 à 19:29:24

Je t'avoue que je ne comprends plus ;-(((

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é ;-( $ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

8

userette, le 22 avr 2009 à 19:34:51

J'ai essayé ton exemple.
en fait, j'ai remarqué que avec sed -n '/01/p;q' list.db il recherche toujours ds la 1ere ligne et quit juste après.

si tu essayait sed -n '/05/p;q' list.db pour voir


stp ça m'aiderait bcp

Répondre à userette

9

jipicy, le 22 avr 2009 à 20:00:09

Effectivement avec une autre ligne que la 1ère ça marche plus ;-\

Bon on va creuser le sujet ;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

10

lami20j, le 22 avr 2009 à 20:32:42

Salut,

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
106485010510997108

Répondre à lami20j

11

jipicy, le 22 avr 2009 à 20:39:43

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 :

$ 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|
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

13

lami20j, le 22 avr 2009 à 21:09:06

Salut jipicy ;-)

De rien ;-)) 106485010510997108

Répondre à lami20j

12

lami20j, le 22 avr 2009 à 21:08:12

Re,

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|
106485010510997108

Répondre à lami20j

14

userette, le 23 avr 2009 à 09:24:45

Salut à tous,
merci pour toutes vos réponses.
j'aime bien la solution en perl. sauf que je ne m'y connais pas trop en perl.

lami20j, tu peux me dire comment j'extrais toute la ligne et non pas seulement le motif ??????

21622010039|14|


merciiiiiiiiiiiiii

Répondre à userette

15

userette, le 23 avr 2009 à 09:28:10

Meme avec le while read ...... grep "" && break, ça marche. superrrrrrr

vous me sauvez la vie :) :) :)

Répondre à userette

16

lami20j, le 23 avr 2009 à 09:31:26

Salut,


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

106485010510997108

Répondre à lami20j

17

dubcek, le 23 avr 2009 à 09:34:42

Hello
et avec awk
awk '/21622010039/ {print $0;exit} < fichier

Répondre à dubcek

18

lami20j, le 23 avr 2009 à 09:38:49

Salut,

T'as pas oublié un apostrophe ? ;-) 106485010510997108

Répondre à lami20j

20

userette, le 23 avr 2009 à 09:43:53

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 !!

Répondre à userette

21

lami20j, le 23 avr 2009 à 09:55:38

Re,

Essaie

perl -ne 'next unless /^21622010039/;print and exit' base
--
106485010510997108

Répondre à lami20j

22

userette, le 23 avr 2009 à 10:58:58

Ok ça marche mnt sauf que si je mets ma commande dans un script :

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 !!!

Répondre à userette

19

dubcek, le 23 avr 2009 à 09:41:48

Effectivement
awk '/21622010039/ {print $0;exit}' < fichier

Répondre à dubcek

23

lami20j, le 23 avr 2009 à 11:12:20

Re,

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. 106485010510997108

Répondre à lami20j

24

userette, le 23 avr 2009 à 11:32:22

Ok. j'ai essayé le code que tu as mis. mais j'ai toujours le même résultat non attendu, à savoir :

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

Répondre à userette

25

lami20j, le 23 avr 2009 à 11:36:29

Re,

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



106485010510997108

Répondre à lami20j

26

userette, le 23 avr 2009 à 11:46:05

Ah ok, j'avais pas compris.
j'avais mis plus haut le contenu de mon fichier :

21622010405
21622010664

Répondre à userette

27

userette, le 23 avr 2009 à 12:46:02

Alors??
help please !! :(
je desespere

Répondre à userette

28

userette, le 23 avr 2009 à 13:30:17

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

Répondre à userette

29

lami20j, le 23 avr 2009 à 13:33:38

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é)

for MSISDN in $(cat msisdn.txt)
do
  echo $MSISDN
  while read ligne
  do 
      echo $ligne|grep $MSISDN && break
  done < base
done
106485010510997108

Répondre à lami20j

30

jipicy, le 23 avr 2009 à 14:46:29

Dis-moi userette, tu peux essayer ça :

 sed '/21622010039/!d;q' fichier
s'il te plait ;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

31

userette, le 23 avr 2009 à 15:43:03

Oui ça marche mais ça ne me renvoie pas toute la ligne. que le 21622010039

Répondre à userette

32

jipicy, le 23 avr 2009 à 15:51:27

Encore une bizarrerie ;-((

Essaie :

 sed '/21622010039.*$/!d;q'
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

33

 userette, le 23 avr 2009 à 18:03:53

Finalement,
j'ai utilisé

`perl -ne "next unless /^$chaine/;print and exit" base  >> output.txt`


ça marche.
merci à toi jipicy.

merci à tous :))))

Répondre à userette
Collection CommentÇaMarche.net