AWK – si pas dans le tableau

J’ai deux fichiers séparés par des tabs. En comparant les fichiers par le premier champ, je dois imprimer la ligne où le champ ne correspond pas. Mais la ligne à imprimer provient du fichier (fichier1)

Fichier1:

adu adu noun singular n/an/a nominative aduink adu noun plural 1pl n/a nominative adum adu noun singular 1s n/a nominative 

Fichier2:

 adu adu noun singular n/an/a nominative aduink adu noun plural 1pl n/a nominative xxadum adu noun singular 1s n/a nominative 

Sortie désirée:

 adum adu noun singular 1s n/a nominative 

Ce que je pense:

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

Mais je dois imprimer, la ligne du fichier (fichier1) pas du fichier (fichier2). Et je ne peux pas changer l’ordre de traitement des fichiers

Je ne comprends pas pourquoi vous ne pouvez pas modifier l’ordre des fichiers (c’est plus simple), mais vous avec le même ordre, vous pouvez le faire:

 awk 'NR==FNR{ a[$1]=$0; next } { delete a[$1] } END{ for (x in a) print a[x] }' file1 file2 

L’idée est de supprimer tous les éléments à l’index $1 lorsque le deuxième fichier est traité. À la fin, il vous suffit d’imprimer les éléments restants.

Pourquoi n’échangez-vous pas les fichiers dans l’argument que vous transmettez à awk ,

 awk 'FNR==NR{a[$1]=$0;next} !($1 in a)' file2 file1 | | arg1 arg2 

Si vous ne pouvez pas modifier l’ordre des fichiers lorsque awk est appelé, changez-le simplement dans awk:

 awk 'BEGIN{t=ARGV[1]; ARGV[1]=ARGV[2]; ARGV[2]=t} FNR==NR{a[$1];next} !($1 in a)' file1 file2 

De cette façon, vous n’avez pas à stocker les fichiers en mémoire.

en retard à la fête, mais voici un moyen plus simple de le faire

 $ join -v1 file1 file2 adum adu noun singular 1s n/a nominative 

c’est-à-dire pour supprimer les lignes jointes et imprimer les lignes non appariées à partir du premier fichier. Par défaut, la jointure est effectuée par le premier champ.