Comment obtenir la différence (uniquement des ajouts) entre deux fichiers dans linux
J'ai deux fichiers A1 et A2 (non triées). A1 est la version précédente de l'A2 et de quelques lignes ont été ajoutées à A2. Comment puis-je obtenir les nouvelles lignes sont ajoutées à A2?
Remarque: je veux juste que les nouvelles lignes ajoutées et ne veulent pas les lignes qui ont été dans A1 mais supprimé dans la cellule A2. Quand je fais diff A1 A2
, je reçois les ajouts ainsi que la suppression, mais je veux seulement des ajouts.
S'il vous plaît suggérer une façon de le faire.
- sont toutes les lignes ajoutées dans A2 nouvelle pour le fichier? Je ne veux pas de doublons avec les lignes existantes?
- pas de doublons
Vous devez vous connecter pour publier un commentaire.
diff
et puisgrep
pour le modifier le type que vous voulez.+
au début de la lignediff -u A1 A2 | grep '^\+' | sed -E 's/^\+//'
Tous les ci-dessous est copié directement à partir de @TomOnTime de serverfault réponse ici:
Afficher les lignes qui n'existent que dans un fichier: (c'est à dire ce qui a été supprimé à partir d'un)
Afficher les lignes qui n'existent que dans le fichier b: (c'est à dire ce qui a été ajouté à b)
Afficher les lignes qui n'existent que dans un seul fichier ou de l'autre: (mais pas les deux)
(Avertissement: Si le fichier
a
a des lignes qui commencent par ONGLET, il (le premier ONGLET) sera retiré de la sortie.)REMARQUE: les Deux fichiers doivent être triés pour "comm" pour fonctionner correctement. Si elles ne sont pas déjà triés, vous devez les trier:
Si les fichiers sont extrêmement longs, cela peut être un peu lourde car elle nécessite une copie supplémentaire et donc deux fois plus d'espace disque.
Edit: notez que la commande peut être écrit de façon plus concise, à l'aide de processus de substitution (merci à @phk pour le commentaire):
bash
ici la dernière commande peut être simplifié àcomm -12 <(sort < a) <(sort < b)
à l'aide de processus de substitution.Vous pouvez essayer ce
Les options sont documentées dans
man diff
:et:
et:
''
après--unchanged-group-format=''
ressemble à un seul"
, qui ne marchera pas. Peut-être modifier la''
à""
de peur que quelqu'un tape votre réponse avec un simple"
.+
symboles et inutile méta ligne.La méthode est simple à utiliser :
Une autre méthode consiste à utiliser
comm
, comme vous pouvez le voir dans La comparaison de deux listes non triées dans linux, l'inscription de l'unique dans le second fichierVous pouvez taper:
A1
contient une lignex
, et fichierA2
contient une lignex
et l'autre de la ligne dexx
. Cette commande renvoie rien depuis deux lignes dansA2
contientx
.grep
's-x
(--line-regexp
) peut être utilisé pour assurer l'ensemble de la ligne est en correspondance. Donc, si A1 contientx
et A2 contientxx
, un match ne sera pas trouvé.grep -E "^\+"
est à partir de la précédente accepté de répondre, il est incomplet car les feuilles non-sourcegrep -v '+++ b'
supprime non-source ligne avec le nom de fichier version ultérieurecut -c 2-
supprime la colonne de+
signes, peuvent également utiliser dessed 's/^\+//'
comm
ousdiff
n'étaient pas une option en raison de git.Une approche similaire à merp mais espérons-le, plus compréhensible et facile à modifier: