Existe-t-il un outil capable d'obtenir des lignes contenues dans le fichier A, mais pas dans le fichier B ? Je pourrais faire un petit script simple avec, par exemple, perl, mais si quelque chose comme ça existe déjà, je vais gagner du temps à partir de maintenant.
Réponse acceptée :
Oui. Le grep
standard outil de recherche de fichiers pour les chaînes de texte peut être utilisé pour soustraire toutes les lignes d'un fichier d'un autre.
grep -F -x -v -f fileB fileA
Cela fonctionne en utilisant chaque ligne dans fileB comme modèle (-f fileB
) et le traiter comme une chaîne simple pour correspondre (pas une regex régulière) (-F
). Vous forcez la correspondance sur toute la ligne (-x
) et n'affiche que les lignes qui ne correspondent pas (-v
). Par conséquent, vous imprimez les lignes du fichier A qui ne contiennent pas les mêmes données que n'importe quelle ligne du fichier B.
L'inconvénient de cette solution est qu'elle ne tient pas compte de l'ordre des lignes et si votre entrée comporte des lignes en double à différents endroits, vous risquez de ne pas obtenir ce que vous attendez. La solution à cela est d'utiliser un véritable outil de comparaison tel que diff
. Vous pouvez le faire en créant un fichier diff avec la valeur de contexte à 100 % des lignes du fichier, puis en l'analysant uniquement pour les lignes qui seraient supprimées lors de la conversion du fichier A en fichier B. (Notez également que cette commande supprime la mise en forme diff après avoir obtenu les bonnes lignes.)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC