Comparez deux fichiers uniquement en fonction de la première colonne et supprimez la ligne en double du deuxième fichier dans le script shell

Je vais poser ma question avec un exemple. J’ai 2 fichiers:

Fichier n ° 1

002948998 752986QAK NTR974VTS 0000000 102948932 752986QSC NTR974VTS 0000000 102948933 752986QSC NTR974VTS 0000000 

Fichier n ° 2

 002901998 752986KFK NTR974MTS 0990000 002948998 752986QAQ NTR974VTS 0000000 002901998 752986KFK NTR974MTJ 0990000 

Sortie désirée :

 002948998 752986QAK NTR974VTS 0000000 102948932 752986QSC NTR974VTS 0000000 102948933 752986QSC NTR974VTS 0000000 002901998 752986KFK NTR974MTS 0990000 

Note: il n’y a pas d’espace (enter) entre les lignes.

Je voudrais comparer le fichier 1 et le fichier 2 en utilisant leurs premières colonnes et supprimer la ligne entière du fichier 2 s’ils correspondent au fichier 1. Je souhaite également enregistrer les résultats dans un premier fichier ou un nouveau fichier, fichier # 3 qui contient toutes les entrées du fichier 1 et du fichier 2 (sans les doublons du fichier 2). S’il vous plaît aviser une bonne résolution en script shell.

actuellement j’utilise:

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

mais il ne se compare pas en fonction de la première colonne seulement. au lieu de cela, il compare la ligne entière.

S’il vous plaît aider.

Ceci est un idiome célèbre: imprimez une ligne uniquement lorsque le premier champ est vu pour la première fois:

 awk '!seen[$1]++' file1 file2 > file3 
 002948998 752986QAK NTR974VTS 0000000 102948932 752986QSC NTR974VTS 0000000 102948933 752986QSC NTR974VTS 0000000 002901998 752986KFK NTR974MTS 0990000 

Cela repose sur:

  • awk en considérant les éléments du tableau non défini comme zéro
  • post-incrémentation renvoyant la valeur actuelle de la variable
  • l’action par défaut pour la condition “true” consiste à imprimer la ligne

Préserver toutes les lignes du premier fichier, tout en supprimant les dups dans le second fichier

 awk '!seen[$1]++ || NR==FNR' file1 file2 > file3 

Peut être:

 cp file1 file3; grep -Fv "$(cut -f 1 -d ' ' < file1)" file2 >> file3