Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/11/2012, à 10:38

Jean-Rémi

Comparaison de deux fichiers .csv

Bonjour,

Je voudrais comparer deux fichiers .csv pour n'extraire du premiers que les lignes qui ne sont pas présentes dans le second (à sens unique).
Les lignes sont relativement lourdes/longues : une centaine de colonnes contenant de long morceau de texte HTML.
Les lignes ne sont pas dans le même ordre d'un fichier à l'autre.

Y a t-il un moyen simple (j'entends par là, sans réinventer la moulinette) de faire cela  ?

Hors ligne

#2 Le 19/11/2012, à 10:52

cedric.amouyal

Re : Comparaison de deux fichiers .csv

essaye un truc comme ca
n=5
diff f1 f2 |grep ^> |head $n | sed 's/^>//g'

Hors ligne

#3 Le 19/11/2012, à 12:51

credenhill

Re : Comparaison de deux fichiers .csv

hello
affiche les lignes  présentes dans fichier1 mais pas pas fichier2

awk 'ARGIND==1 {x[$0]++; next} !x[$0]' fichier2.csv fichier1.csv

Dernière modification par credenhill (Le 19/11/2012, à 12:52)

Hors ligne

#4 Le 19/11/2012, à 20:42

pingouinux

Re : Comparaison de deux fichiers .csv

Bonsoir,

cedric.amouyal #2 a écrit :

diff f1 f2 |grep ^> |head $n | sed 's/^>//g'

Les fichiers doivent être triés avant defaire le diff. Je propose plutôt ceci :

diff <(sort f1) <(sort f2) | sed -n '/^</s/^< //p'

Correction : Ajout de -n à sed

Dernière modification par pingouinux (Le 19/11/2012, à 21:19)

Hors ligne

#5 Le 19/11/2012, à 20:51

tiramiseb

Re : Comparaison de deux fichiers .csv

ben dites donc, vous allez chercher la complication hein...
Soit avec le rouleau compresseur awk, soit par une utilisation détournée de diff...

Allez, une solution simple :

grep -vFf lignes_a_supprimer.csv fichier_a_filtrer.csv

grep : rechercher des lignes
-v : afficher les lignes qui ne correspondent pas à la recherche
-F : ne pas interpréter les lignes à chercher comme des regex
-f <fichier> : prendre les lignes à rechercher dans le fichier <fichier> au lieu des arguments de la commande

Hors ligne

#6 Le 19/11/2012, à 20:57

pingouinux

Re : Comparaison de deux fichiers .csv

@tiramiseb #5 : Merci ! J'aurai encore appris quelque chose aujourd'hui.

Hors ligne

#7 Le 19/11/2012, à 21:08

Postmortem

Re : Comparaison de deux fichiers .csv

Salut,
@titamiseb, il me semble que la solution avec grep est beaucoup plus lente que awk, surtout si les fichiers sont gros.
Je peux pas tester là mais il me semble qu'il y avait déjà eu un post dans ce genre et grep avec la liste de motifs dans un fichier faisait que le traitement était vraiment tres long.
Enfin, je dis ça de tete ! Ça se trouve que je me plante !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#8 Le 20/11/2012, à 05:04

nesthib

Re : Comparaison de deux fichiers .csv

@tiramiseb : attention, ta solution a un biais énorme. Elle ne compare pas les lignes mais considère les lignes du fichier1 comme des motifs (même sans regex). Un exemple simple, si une ligne du fichier1 contient « a », toutes les lignes de fichier2 incluant la lettre « a » seront écartées, ce qui est je pense non souhaité. Dans la plupart des cas ça fonctionnera mais il est très difficile de prévoir les cas particuliers.

@pingoulinux :
Une solution pour des fichiers triés :

comm -13 fichier1 fichier2

ou en les triant à la volée :

comm -13 <(sort fichier1) <(sort fichier2)

Pour garder l'ordre des lignes et n'avoir aucune ambiguïté sur la comparaison des lignes, il n'y a pas d'autres solution que de prendre une approche comme celle de credenhill (qui est selon moi une des plus courtes et efficaces).


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#9 Le 20/11/2012, à 05:37

pingouinux

Re : Comparaison de deux fichiers .csv

@nesthib #8 :
Je ne sais pas pour la rapidité, mais ceci devrait marcher (ajout de -x au grep de tiramiseb#5) :

grep -vFxf lignes_a_supprimer.csv fichier_a_filtrer.csv

Extrait de man grep

-x, --line-regexp
              Select  only  those  matches  that exactly match the whole line.
              (-x is specified by POSIX.)

Hors ligne

#10 Le 20/11/2012, à 06:19

tiramiseb

Re : Comparaison de deux fichiers .csv

Merci  pingouinux, j'avais en effet oublié -x .

Je serais curieux de voir un petit benchmark smile

Qui s'y colle ? big_smile

Hors ligne

#11 Le 20/11/2012, à 06:55

pingouinux

Re : Comparaison de deux fichiers .csv

Le programme de test

$ cat x
a=$1; b=$2

wc $a $b

echo -e "\nawk"
time awk 'ARGIND==1 {x[$0]++; next} !x[$0]' $b $a >awk.out

echo -e "\ncomm"
time comm -23 <(sort $a) <(sort $b) >comm.out

echo -e "\ngrep"
time grep -vFxf $b $a >grep.out

Les résultats

$ ./x aa bb
  4587522  66191369 419823658 aa
  4587522  66191371 419823676 bb
  9175044 132382740 839647334 total

awk

real	0m5.195s
user	0m4.940s
sys	0m0.248s

comm

real	0m15.690s
user	0m26.270s
sys	0m2.408s

grep

real	0m34.233s
user	0m33.634s
sys	0m0.552s

@nesthib #8 : C'est comm -23

Hors ligne

#12 Le 20/11/2012, à 09:23

Postmortem

Re : Comparaison de deux fichiers .csv

Ben dis donc !
awk est un rouleau compresseur formule 1 !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#13 Le 20/11/2012, à 10:10

tiramiseb

Re : Comparaison de deux fichiers .csv

J'avoue, c'est bluffant !

Hors ligne

#14 Le 21/11/2012, à 00:26

nesthib

Re : Comparaison de deux fichiers .csv

@pingouinux : bien vu j'avais oublié l'option -x de grep wink Pour comm, tout dépend du fichier de référence, dans mon cas je prenais fichier1 c'est donc bien -13 (pour afficher le 2)

Sinon, awk est extrêmement puissant et rapide, de plus en plus je l'utilise pour remplacer grep, cut et autre programmes.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne