web-dev-qa-db-fra.com

Obtenir les lignes uniques du second fichier en résultat de la comparaison de deux fichiers

J'ai deux fichiers texte et je veux lire file1 ligne par ligne, en recherchant la même ligne dans file2 et en la supprimant de file2.

J'ai le pseudocode de:

for line in file1.txt
do
  sed search line and delete in file2.txt
done
6
anlarye

Vous pouvez accomplir cela avec grep.

Voici un exemple:

$ echo localhost > local_hosts

$ grep -v -f local_hosts /etc/hosts
127.0.1.1       ubuntu

# The following lines are desirable for IPv6 capable hosts
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
6
Michael Madden

Généralement, vous voulez conserver les lignes dans fichier2 qui ne figurent pas réellement dans fichier1.

Il y a plus de possibilités de ceux-ci,

comm <(sort file1) <(sort file2) -23

via rejoindre

join -v 1 <(sort file1) <(sort file2)

ou via AWK qui n'a pas besoin de trier les fichiers:

awk 'NR==FNR{lines[$0];next} !($0 in lines)' file2 file1
5
αғsнιη

J'ai trouvé un moyen de le faire grâce à quelques recherches supplémentaires sur Internet. Et en utilisant seulement grep aussi sans avoir besoin de trier le fichier.

grep -Fvxf file2 file1

Cela affichera les nouvelles informations à l'écran, ce qui pose un problème, car je voulais supprimer ce qui se trouvait dans le fichier 2 de fichier1 et créer un nouveau fichier1. Comme le code ci-dessus fonctionnait, il me suffisait d’y ajouter quelque chose pour obtenir ce que je voulais.

grep -Fvxf file2 file1 > tempfile && mv tempfile file1

Cela résout mes problèmes. Peut-être pas la meilleure façon mais ça marche.

0
anlarye