198 votes

Comment supprimer les lignes qui apparaissent sur le fichier B à partir d'un autre fichier A ?

J'ai un grand fichier A (composé de courriers électroniques), une ligne pour chaque courrier. J'ai également un autre fichier B qui contient une autre série de messages.

Quelle commande dois-je utiliser pour supprimer du fichier A toutes les adresses qui apparaissent dans le fichier B.

Ainsi, si le fichier A contient :

A
B
C

et le dossier B contenu :

B    
D
E

Dans ce cas, le fichier A devrait être laissé avec :

A
C

Je sais que c'est une question qui aurait pu être posée plus souvent, mais je n'ai trouvé que une commande en ligne qui m'a donné une erreur avec un mauvais délimiteur.

Toute aide serait très appréciée ! Quelqu'un trouvera certainement une solution intelligente, mais je ne suis pas un expert en shell.

1 votes

1 votes

La plupart des réponses ici concernent des fichiers triés, et la plus évidente est manquante, ce qui n'est bien sûr pas de votre faute, mais qui rend l'autre plus généralement utile.

-1voto

Aakarsh Gupta Points 97

Pour supprimer les lignes communes entre deux fichiers, vous pouvez utiliser les commandes grep, comm ou join.

grep ne fonctionne que pour les petits fichiers. Utilisez -v avec -f.

grep -vf file2 file1 

Cela permet d'afficher les lignes du fichier 1 qui ne correspondent à aucune ligne du fichier 2.

comm est une commande utilitaire qui travaille sur des fichiers triés lexicalement. Il prend prend deux fichiers en entrée et produit trois colonnes de texte en sortie : lignes uniquement dans le premier fichier ; lignes uniquement dans le second fichier ; et lignes dans les deux fichiers. Vous pouvez supprimer l'impression de n'importe quelle colonne en utilisant les options -1, -2 ou -3.

comm -1 -3 file2 file1

Cela permet d'afficher les lignes du fichier 1 qui ne correspondent à aucune ligne du fichier 2.

Enfin, il y a join, une commande utilitaire qui effectue une égalité sur les fichiers spécifiés. Son option -v permet également de supprimer lignes communes entre deux fichiers.

join -v1 -v2 file1 file2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X