Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1498 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2118724
epo03
Posté le 29-12-2011 à 17:17:58  profilanswer
 

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

mood
Publicité
Posté le 29-12-2011 à 17:17:58  profilanswer
 

n°2118730
Profil sup​primé
Posté le 29-12-2011 à 18:04:04  answer
 

salut,
 

Code :
  1. grep -v -f fic1 fic2

peut-être.

n°2118760
epo03
Posté le 30-12-2011 à 10:47:49  profilanswer
 

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

n°2118914
Sve@r
Posté le 01-01-2012 à 11:23:06  profilanswer
 

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.
n°2119342
epo03
Posté le 04-01-2012 à 09:22:19  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
[Shell/Dos] Pipe dans une boucle FOR[Shell/Unix] Tableaux
[Shell/Unix] Reactualisation de variable dans une boucleScript TELNET Unix vers Windows
[bash] grep sur des lignes très longues, souci[Shell Unix] Active trace exeuction dans les fonctions
[Shell UNIX] Recherche dans une ligne 
Plus de sujets relatifs à : [Shell/Unix] Equivalence à "grep -v"


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR