# Commande pour faire la différence entre deux fichiers

**URL:** <https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 9:25 UTC](https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158 "2016-02-21T21:25:09Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Esprit](https://www.debian-fr.org/user_avatar/www.debian-fr.org/esprit/32/5917_2.png) [@Esprit](https://www.debian-fr.org/u/Esprit)\
**Post date:** [Février 21, 2016, 9:25 UTC](https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158/1 "2016-02-21T21:25:09Z")

</div>

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](http://meldmerge.org/) mais je n’arrive pas à exporter les différences…

Une idée pour faire ça simplement ?

Merci d’avance,

---

<div class="post-metadata">

**Author:** ![thuban](https://www.debian-fr.org/user_avatar/www.debian-fr.org/thuban/32/4177_2.png) [@thuban](https://www.debian-fr.org/u/thuban)\
**Post date:** [Février 21, 2016, 9:25 UTC](https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158/2 "2016-02-21T21:25:09Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Arnaud](https://www.debian-fr.org/user_avatar/www.debian-fr.org/arnaud/32/4098_2.png) [@Arnaud](https://www.debian-fr.org/u/Arnaud)\
**Post date:** [Février 21, 2016, 9:25 UTC](https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158/3 "2016-02-21T21:25:09Z")

</div>

```auto

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.

---

<div class="post-metadata">

**Author:** ![Esprit](https://www.debian-fr.org/user_avatar/www.debian-fr.org/esprit/32/5917_2.png) [@Esprit](https://www.debian-fr.org/u/Esprit)\
**Post date:** [Février 21, 2016, 9:25 UTC](https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158/4 "2016-02-21T21:25:09Z")

</div>

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… 😒

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. 😉

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

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

---

<div class="post-metadata">

**Author:** ![vohu](https://www.debian-fr.org/user_avatar/www.debian-fr.org/vohu/32/4108_2.png) [@vohu](https://www.debian-fr.org/u/vohu)\
**Post date:** [Février 21, 2016, 9:25 UTC](https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158/5 "2016-02-21T21:25:47Z")

</div>

graphiquement, j’utilise meld

meld fichier1 fichier2 fichier3

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 21, 2016, 9:26 UTC](https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158/6 "2016-02-21T21:26:47Z")

</div>

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)

---

<div class="post-metadata">

**Author:** ![Esprit](https://www.debian-fr.org/user_avatar/www.debian-fr.org/esprit/32/5917_2.png) [@Esprit](https://www.debian-fr.org/u/Esprit)\
**Post date:** [Février 21, 2016, 9:27 UTC](https://www.debian-fr.org/t/commande-pour-faire-la-difference-entre-deux-fichiers/65158/7 "2016-02-21T21:27:03Z")

</div>

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 «&nbsp;tag&nbsp;».

Je résume le problème. J’ai deux fichiers. Le deuxième contient une partie des «&nbsp;tags&nbsp;» 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](https://www.debian-fr.org/uploads/default/original/1X/7bbea83f89515ab7c7a738dddb86c4d4f140bd13.gif "reflechit") 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 «&nbsp;PFILLN05.PRAU\_6810034\_PCHAMBER\_CONVERT.F\_CV&nbsp;» ou la ligne «&nbsp;PFILLN05.PRAU\_6810034\_T1\_CONVERTED.F\_CV&nbsp;» ?!

`$ 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](http://pwet.fr/man/linux/commandes/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 «&nbsp;\<&nbsp;» à 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

```auto
$ 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.

```auto
$ 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:](https://www.debian-fr.org/uploads/default/original/1X/c5479df83c1e5adae8782ae88416ebec2c474ae1.gif "Dance")
