#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,
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
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
Qui s'y colle ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
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 !
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
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 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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne