web-dev-qa-db-fra.com

Comment obtenir la différence (seulement des ajouts) entre deux fichiers sous Linux

J'ai deux fichiers A1 et A2 (non triés). A1 est la version précédente de A2 et certaines lignes ont été ajoutées à A2. Comment puis-je obtenir les nouvelles lignes ajoutées à A2?

Note: Je veux juste que les nouvelles lignes soient ajoutées et ne veux pas les lignes qui étaient en A1 mais supprimées en A2. Quand je fais diff A1 A2, Je reçois les ajouts ainsi que les suppressions mais je ne veux que des ajouts.

S'il vous plaît suggérer un moyen de le faire.

46
user1004985

diff puis grep pour le type de modification souhaité.

diff -u A1 A2 | grep -E "^\+"
41
timrau

Tous les éléments ci-dessous sont copiés directement à partir de la réponse serverfault de @ TomOnTime ici :

Afficher les lignes qui n'existent que dans le fichier a: (c'est-à-dire ce qui a été supprimé de a)

comm -23 a b

Afficher les lignes qui n'existent que dans le fichier b: (c'est-à-dire ce qui a été ajouté à b)

comm -13 a b

Afficher les lignes qui n'existent que dans un fichier ou l'autre: (mais pas les deux)

comm -3 a b | sed 's/^\t//'

(Avertissement: si le fichier a contient des lignes commençant par TAB, il (le premier TAB) sera supprimé de la sortie.)

REMARQUE: Les deux fichiers doivent être triés pour que "comm" fonctionne correctement. S'ils ne sont pas déjà triés, vous devez les trier:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted

Si les fichiers sont extrêmement longs, cela peut s'avérer fastidieux, car il nécessite une copie supplémentaire et par conséquent deux fois plus d'espace disque.

Edit: notez que la commande peut être écrite de manière plus concise en utilisant la substitution de processus (merci à @phk pour le commentaire):

comm -12 <(sort < a) <(sort < b)
46
scottkosty

Tu peux essayer ça

diff --changed-group-format='%>' --unchanged-group-format='' A1 A2

Les options sont documentées dans man diff:

       --GTYPE-group-format=GFMT
              format GTYPE input groups with GFMT

et:

       LTYPE is 'old', 'new', or 'unchanged'.
              GTYPE is LTYPE or 'changed'.

et:

              GFMT (only) may contain:

       %<     lines from FILE1

       %>     lines from FILE2

       [...]
40
merp

Vous pouvez taper:

grep -v -f A1 A2
7
Zabador

La méthode simple consiste à utiliser:

sdiff A1 A2

Une autre méthode consiste à utiliser comm, comme vous pouvez le voir dans Comparaison de deux listes non triées sous Linux, listant l'unique dans le second fichier

6
Mihai8
git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
  • grep -E "^\+" est une réponse précédente acceptée, elle est incomplète car elle laisse des éléments non source
  • grep -v '+++ b' supprime la ligne non source avec le nom de fichier de la version ultérieure
  • cut -c 2- supprime la colonne de + signes, peut également utiliser sed 's/^\+//'

comm ou sdiff n'étaient pas une option à cause de git.

5
user1046885

Une approche similaire pour les merp's mais avec un espoir plus compréhensible et facile à modifier:

diff \
  --new-line-format="- %L" \
  --old-line-format="" \
  --unchanged-line-format="" \
  A1 A2
2
Francesc Rosas