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.