Commande pour faire la différence entre deux fichiers

Bonjour,

J’ai deux fichiers (fichier1: ~5000 lignes et fichier2: ~2000 lignes). Les lignes du fichier2 sont présentes dans le fichier1 et je cherche à isoler les ~3000 lignes du fichier1 qui ne sont pas présentes dans le fichier2.

J’ai essayé avec diff mais ça ne me semble pas être la commande adaptée. J’ai également essayé avec comp mais je ne pense pas non plus que ça corresponde à ce qu’il me faut. J’ai aussi utilisé Meld mais je n’arrive pas à exporter les différences…

Une idée pour faire ça simplement ?

Merci d’avance,

Pour en revenir à diff, peut -être simplement : diff fichier1 fichier2 |grep "^<"


L'option -1 masque les entrées du premier fichier, l'option -2 masque les entrées du second fichier et l'option -3 masque les entrées présentes dans les deux fichiers.

L’option -1 masque les entrées du premier fichier, l’option -2 masque les entrées du second fichier et l’option -3 masque les entrées présentes dans les deux fichiers.

Merci !
C’est parfois vexant quand on a passé un certain temps à chercher une solution et qu’on a pas trouvé alors que c’était juste sous son nez… :unamused:

Voici les fichiers de test, non triés :

$ cat fichier1.txt blu bla blo ble $ cat fichier2.txt ble blo

1)Les solutions sans trier les fichiers (spoiler: ça ne fonctionne pas!)
Avec “diff” et “grep” :

$ diff fichier1.txt fichier2.txt | grep "^<" < blu < bla < blo

Avec “comm” :

$ comm -3 fichier1.txt fichier2.txt > diff.txt comm: fichier 1 n'est pas dans l'ordre attendu $ cat diff.txt ble blo blu bla blo ble

Tri des fichiers et fichiers triés :

$ sort fichier1.txt -o fichier1.txt $ sort fichier2.txt -o fichier2.txt $ cat fichier1.txt bla ble blo blu $ cat fichier2.txt ble blo

  1. Les solutions après tri. (spoiler: ça marche!)
    On recommence avec “diff” et “grep” :

$ diff fichier1.txt fichier2.txt | grep "^<" < bla < blu

Et avec “comm” :

$ comm -3 fichier1.txt fichier2.txt > diff.txt $ cat diff.txt bla blu

Il faut donc que les fichiers de départ soient triés !

[Edit: J’ai raccourci mes fichiers de test pour que ça soit plus clair et pour exposer proprement les solutions proposées et ce que ça donne. :wink:

[Edit2: Tiens, on ne sait pas accepter plusieurs réponses ?

[HS: Marrant, j’ai un Shaarli aussi! ^^

graphiquement, j’utilise meld

meld fichier1 fichier2 fichier3

vimdiff marche très bien également mais effectivement sans un tri préalable c’est plus compliqué. (pour ceux qui n’aurait pas d’environnement graphique :p)

Bonjour à tous,

J’ai pas mal chipoté pour arriver à faire ce que je voulais parce que diff prend en compte aussi la ligne où apparait mon “tag”.

Je résume le problème. J’ai deux fichiers. Le deuxième contient une partie des “tags” qui sont dans le premier fichier. Comment trouver quels tags sont dans le premier et pas dans le deuxième ?

Fichiers de bases :

PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceAverageEventRate PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceMaximumEventRate PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceMinimumEventRate PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceOutOfOrderEvents PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceOverruns PFILLN05.PRAU_6810034_PCHAMBER_CONVERT.F_CV PFILLN05.PRAU_6810034_T10_CONVERTED.F_CV PFILLN05.PRAU_6810034_T11_CONVERTED.F_CV PFILLN05.PRAU_6810034_T12_CONVERTED.F_CV PFILLN05.PRAU_6810034_T13_CONVERTED.F_CV PFILLN05.PRAU_6810034_T14_CONVERTED.F_CV PFILLN05.PRAU_6810034_T15_CONVERTED.F_CV PFILLN05.PRAU_6810034_T16_CONVERTED.F_CV PFILLN05.PRAU_6810034_T1_CONVERTED.F_CV PFILLN05.PRAU_6810034_T2_CONVERTED.F_CV PFILLN05.PRAU_6810034_T3_CONVERTED.F_CV PFILLN05.PRAU_6810034_T4_CONVERTED.F_CV PFILLN05.PRAU_6810034_T5_CONVERTED.F_CV PFILLN05.PRAU_6810034_T6_CONVERTED.F_CV PFILLN05.PRAU_6810034_T7_CONVERTED.F_CV PFILLN05.PRAU_6810034_T8_CONVERTED.F_CV PFILLN05.PRAU_6810034_T9_CONVERTED.F_CV

PFILLN05.PRAU_6810034_PCHAMBER_CONVERT.F_CV PFILLN05.PRAU_6810034_T1_CONVERTED.F_CV PFILLN05.PRAU_6810034_T2_CONVERTED.F_CV PFILLN05.PRAU_6810034_T3_CONVERTED.F_CV PFILLN05.PRAU_6810034_T4_CONVERTED.F_CV

1er essais :

$ diff fich1.txt fich2.txt | grep "< " < PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceAverageEventRate < PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceMaximumEventRate < PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceMinimumEventRate < PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceOutOfOrderEvents < PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceOverruns < PFILLN05.PRAU_6810034_T10_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T11_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T12_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T13_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T14_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T15_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T16_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T5_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T6_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T7_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T8_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T9_CONVERTED.F_CV

Ça marche sur ces deux petits extraits de fichiers mais ça ne marche pas sur mes deux gros fichiers. :017 Quand je fais la même chose avec les deux fichiers complets, j’ai toutes les fichiers du premier fichier qui apparaissent… Par exemple, la ligne “PFILLN05.PRAU_6810034_PCHAMBER_CONVERT.F_CV” ou la ligne “PFILLN05.PRAU_6810034_T1_CONVERTED.F_CV” ?!

$ diff tags_de_HISTORIAN_sorted.txt tags_des_COURBES_SCADA_et_REPORTING_CHART_sorted.txt | grep "< " | more < PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceAverageEventRate < PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceMaximumEventRate (...) < PerfTag_PFILLND_11_iFIX_InterfaceTotalEventsReported < PFILLN05.PRAU_6810034_PCHAMBER_CONVERT.F_CV < PFILLN05.PRAU_6810034_T10_CONVERTED.F_CV (...) < PFILLN05.PRAU_6810034_T16_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T1_CONVERTED.F_CV (...)

J’ai fouillé un peu dans le man de diff et voilà ce que j’ai finalement utilisé comme commande :

$ diff -abBiy tags_de_HISTORIAN_sorted.txt tags_des_COURBES_SCADA_et_REPORTING_CHART_sorted.txt | more PerfTag_EMALLNIFIXSRVF_iFixAE_InterfaceAverageEventRate < (...) PerfTag_PFILLND_11_iFIX_InterfaceTotalEventsReported < (...) PFILLN05.PRAU_6810034_PCHAMBER_CONVERT.F_CV PFILLN05.PRAU_6810034_PCHAMBER_CONVERT.F_CV PFILLN05.PRAU_6810034_T16_CONVERTED.F_CV < PFILLN05.PRAU_6810034_T1_CONVERTED.F_CV PFILLN05.PRAU_6810034_T1_CONVERTED.F_CV

Bingo! Les lignes avec le chevrons “<” à la fin sont celles qui n’apparaissent pas dans le deuxième fichier ! Plus qu’à faire un grep là-dessus et à envoyer ça dans un fichier

$ diff -abBiy tags_de_HISTORIAN_sorted.txt tags_des_COURBES_SCADA_et_REPORTING_CHART_sorted.txt | grep "<$" >> fichier_diff.txt

Pour bien faire, il faut encore que je fasse un sed dessus pour nettoyer.

$ diff -abBiy tags_de_HISTORIAN_sorted.txt tags_des_COURBES_SCADA_et_REPORTING_CHART_sorted.txt | grep "<$" | sed -e 's/[ \t]*<$//'  >> fichier_diff_clean.txt 

Yes! Cette fois-ci, c’est parfait ! :dance: