[Shell/Unix] Equivalence à "grep -v"

Equivalence à "grep -v" [Shell/Unix] - Shell/Batch - Programmation

Marsh Posté le 29-12-2011 à 17:17:58    

J'ai 2 fichiers fic1 et fic2 et je veux soustraire à fic2 ce que je trouve dans fic1 ; pas de problème avec des petits fichiers (j'utilise grep -v) mais fic1 fait 4000 lignes et fic2 13 millions de lignes.
J'ai tenté un sed (ci dessous) mais il va me falloir beaucoup de temps pour traiter l'ensemble de mes données.
Un awk existe t'il comme pour remplacer le grep (awk -F'.' 'NR==FNR { Num[$0] ; next } ($1 in Num)' fic1 fic2) ?
 
cat fic1
aaa
ddd
 
cat fic2
aaa.111
bbb.222
ccc.333
ddd.444
 
for i in `cat fic1`
do
sed s/$i/xxxxxxxxxxxxx/ fic2 > fic_tmp
mv fic_tmp fic2
done
 
grep -v "xxxxxxxxxxxxx" fic2 > fic3
 
cat fic3  
bbb.222
ccc.333

Reply

Marsh Posté le 29-12-2011 à 17:17:58   

Reply

Marsh Posté le 29-12-2011 à 18:04:04    

salut,
 

Code :
  1. grep -v -f fic1 fic2

peut-être.

Reply

Marsh Posté le 30-12-2011 à 10:47:49    

Merci je ne connaissais pas cette option du grep ; c'est beaucoup plus rapide que ma boucle avec sed

Reply

Marsh Posté le 01-01-2012 à 11:23:06    

epo03 a écrit :

J'ai 2 fichiers fic1 et fic2 et je veux soustraire à fic2 ce que je trouve dans fic1 ; pas de problème avec des petits fichiers (j'utilise grep -v) mais fic1 fait 4000 lignes et fic2 13 millions de lignes.
J'ai tenté un sed (ci dessous) mais il va me falloir beaucoup de temps pour traiter l'ensemble de mes données.
Un awk existe t'il comme pour remplacer le grep (awk -F'.' 'NR==FNR { Num[$0] ; next } ($1 in Num)' fic1 fic2) ?
 
cat fic1
aaa
ddd
 
cat fic2
aaa.111
bbb.222
ccc.333
ddd.444
 

Code :
  1. for i in `cat fic1`
  2. do
  3. sed s/$i/xxxxxxxxxxxxx/ fic2 > fic_tmp
  4. mv fic_tmp fic2
  5. done
  6.  
  7. grep -v "xxxxxxxxxxxxx" fic2 > fic3


 
cat fic3  
bbb.222
ccc.333


 
Salut
 
Sans parler de la solution de watael, pourquoi toute cette magouille de remplacer les éléments de fic1 par xxxxxxxxx ? Que se passera-t-il si une ligne originelle de fic1 contient vraiment xxxxxxxxxx ?
 

Code :
  1. cat fic2 | while read ligne
  2. do
  3.    exec 3<fic1
  4.    rm -f fic1
  5.    cat 0<&3 | grep -v "$ligne" > fic1
  6. done


 
Accessoirement on ne fait jamais de for i in `commande complexe` parce que si la commande complexe renvoie des infos avec espace, le for va partir en torche...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-01-2012 à 09:22:19    

Sve@r a écrit :


 
Salut
 
Sans parler de la solution de watael, pourquoi toute cette magouille de remplacer les éléments de fic1 par xxxxxxxxx ? Que se passera-t-il si une ligne originelle de fic1 contient vraiment xxxxxxxxxx ?
...


Tu as raison mais c'est la solution qui m'est venu à l'esprit tout de suite et je maitrisais le contenu de fic1

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed