2 votes

Comment supprimer des lignes basées sur un autre fichier ?

Maintenant j'ai deux fichiers comme suit :

$ cat file1.txt
john  12  65  0
Nico  3   5   1
king  9   5   2
lee   9   15  0

$ cat file2.txt
Nico
king

Maintenant je voudrais supprimer chaque ligne qui contient un nom de la deuxième fichier dans sa première colonne.

Résultat idéal :

john  12  65  0
lee   9   15  0

Est-ce que quelqu'un pourrait me dire comment faire ça ? J'ai essayé le code suivant :

for i in 'less file2.txt'; do sed "/$i/d" file1.txt; done

Mais ça ne fonctionne pas correctement.

6voto

Ruelos Joel Points 650

Vous n'avez pas besoin de l'itérer, il vous suffit d'utiliser grep avec l'option -v pour inverser la correspondance et -w pour forcer le motif à correspondre uniquement à des mots ENTIERs

grep -wvf file2.txt file1.txt

3voto

anubhava Points 172509

Ce travail convient à awk:

awk 'NR == FNR {a[$1]; next} !($1 in a)' file2.txt file1.txt

john  12  65  0
lee   9   15  0

Détails:

NR == FNR {                  # Pendant le traitement du premier fichier
  a[$1]                      # stockez le premier champ dans un tableau a
  next                       # passez à la ligne suivante
}
!($1 in a)                   # pendant le traitement du deuxième fichier
                             # si le premier champ n'existe pas dans le tableau a alors imprimez

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