====== Comparer deux fichiers texte ====== ===== Comparaisons ligne à ligne ===== Sources : * [[http://linux.die.net/man/1/comm|man comm]] (en) * [[http://serverfault.com/questions/68684/how-can-i-get-diff-to-show-only-added-and-deleted-lines-if-diff-cant-do-it-wh|comm vs sdiff vs diff]] (en) * [[http://www.man-linux-magique.net/man1/sort.html|man sort]] * [[https://www.madboa.com/geek/sort-addr/|Sort IP Addresses with GNU sort]] ==== Lignes présentes dans A et pas dans B ==== On cherche uniquement à savoir ce qui était dans A et qui a disparu en B((Réciproquement, ce qui dans A a été ajouté à B.)). Concrètement on se désintéresse de qui aurait été ajouté dans B((Respectivement, de ce qui étant dans B, ne serait plus dans A.)). Autrement dit, on se demande ce qu'on perd en passant de A à B ou, réciproquement, ce qu'on gagne en passant de B à A. On commence par un tri préalable afin d'avoir des listes comparables : sort A.sorted sort B.sorted puis on effectue la comparaison voulue : comm -13 B.sorted A.sorted > added.sorted et pour avoir une idée de l'ampleur des ajouts : cat added.sorted | wc -l ==== Lignes présentes uniquement dans A ou dans B ==== En cherche ce qui singularise chaque fichier en négligeant ce qui apparaît dans les deux. Comme précédemment, il faut trier les fichier avec //sort//. Une première version : comm -3 B.sorted A.sorted > exclusiv.sorted présente en deux colonnes (utilisation de //tab//) ce qui est spécifique à B ou à A. Pratique pour un contrôle visuel et plus encore si l'on veut copier le résultat dans une feuille de calcul, dans deux colonnes ;-). Une seconde version presente le même résultat en une seule colonne "fusionnée" : comm -3 B.sorted A.sorted | sed 's/^\t//' > exclusiv.sorted ==== Lignes communes à A et B ==== Comme précédemment, il faut trier les fichier avec //sort//. Puis (l'ordre A, B n'a plus d'importance) : comm -12 A.sorted B.sorted > common.sorted ==== Tri réel ==== Lors des opérations précédentes, le tri préalable (//sort//) sert uniquement à garantir que deux lignes identiques seront placées les unes à la suite des autres. Peu importe que le fichier soit réellement trié, au sens que l'on donne au verbe "trier" en fonction du contenu du fichier. Il peut être pratique ou nécessaire d'avoir un fichier réellement trié. Dans de nombreux cas, il suffit d'ajouter les options appropriées à la commande //sort//. Trier une liste d'adresses IPv4 : sort -V < A > A.sorted Trier une liste d'//enregistrements// composés de //champs// identifiés par un séparateur. L'exemple suivant illustre le traitement d'une adresse IPv4 comme composée de 4 champs numériques séparés par des "." : sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4