J'ai 2 représentations TCL d'un projet qui sont générées par 2 versions différentes du même outil, appelons-les v1.tcl
etv2.tcl
Ces journaux sont normalement logiquement identiques à toutes fins utiles, à l'exception de l'ordre des lignes. Chaque ligne v1.tcl
sera trouvée quelque part exactement v2.tcl
lorsque les versions 1 et 2 de mon projet sont identiques.
J'aimerais pouvoir déterminer si quelqu'un a apporté une modification v2.tcl
qui doit être rétroportée v1.tcl
(ou vice-versa) ... En d'autres termes, j'aimerais seulement voir les lignes qui ne correspondent pas. Par exemple:
v1.tcl
:foo1 bar1 hello1 world1
v2.tcl
:hello1 bar1 foo2 world1 goodbye2
"diff" valeur de retour:
file1:1 foo1 file2:3 foo2 file2:5 goodbye2
Devrais-je juste écrire mon propre petit script? Y at-il un outil qui fait déjà cela?
grep: Trailing backslash
. Je vérifierai les pages de manuel pour savoir si je peux les traiter comme du texte ...grep -vf v2.tcl v1.tcl
erreurs avec "barre oblique inverse", même si je le redirige quelque part comme ci-dessus.-F
pour les corriger et j'ai ajouté votre commentaire / réponse beaucoup plus court à la fin du mien. FYI Je n'ai pas utilisé toute la solution awk, mais j'ai ajouté bash / cut / grep pour afficher le nom du fichier et les lignesRéponses:
Si les lignes sont identiques et que vous voulez seulement savoir s'il y a des lignes supplémentaires dans un fichier ou dans un autre, vous pouvez utiliser sort & diff (et Process Substitution ici):
Avec diff,
-B
ignorer les lignes vides. Vous pouvez ensuite utilisergrep -n [pattern] file
pour trouver la ligne de la tendance est à (peut - être avec un ou une combinaison degrep
,cut
,sed
,awk
), si cela importe.Voici une réponse plus complète, indiquant le numéro de fichier et le numéro de ligne contenant les correspondances. N'utilise pas sed ou awk, seulement bash, cut, grep ... tout y est (essentiellement) dans une ligne:
Ou divisé en plusieurs lignes:
Et en fonction de vos fichiers d'entrée (surtout si vous avez des lignes avec des barres obliques inverses), j'utilise ces options pour read & grep:
read -r
ne pas permettre aux barres obliques inverses d'échapper des caractèresgrep -F
Interprétez PATTERN en tant que liste de chaînes fixes (au lieu d'expressions régulières), séparées par des nouvelles lignes, dont chacune doit correspondreDe plus, en utilisant les commentaires de Pimp Juice IT , s'il y a des barres obliques inverses vers les lignes dans les fichiers en entrée, grep génère l'erreur "fichier: ligne, des barres obliques inversées". L'utilisation de l'
-F
option permettant à grep de supprimer la dernière erreur de barre oblique inversée entraîne une solution beaucoup plus petite réservée à grep:Options de grep utilisées:
-f
Obtenir des modèles de FILE, un par ligne.-F
Interprétez PATTERN en tant que liste de chaînes fixes (au lieu d'expressions régulières), séparées par des nouvelles lignes, dont chacune doit correspondre-v
Inverser le sens de la concordance pour sélectionner des lignes non concordantes.-H
Imprimer le nom du fichier pour chaque match-n
Préfixez chaque ligne de sortie avec le numéro de ligne basé sur 1 dans son fichier d'entrée.la source
-F
finales posaient problème avec mon premier brouillon (non & je pense que `-r``) répondait aussi, bien que l'exemple de texte fonctionne correctement et que les lignes vierges superflues posaient également des problèmes étranges. Mais maintenant, tout semble