Utilisation d'utilitaires moins connus :
sort file1 > file1.sorted
sort file2 > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Cela produira des doublons, donc s'il y a 1 3
en file1
, mais 2 en file2
, cela affichera toujours 1 3
. Si ce n'est pas ce que vous voulez, dirigez la sortie de sort
à uniq
avant de l'écrire dans un fichier :
sort file1 | uniq > file1.sorted
sort file2 | uniq > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Il existe de nombreux utilitaires dans le package GNU coreutils qui permettent toutes sortes de manipulations de texte.
$ awk 'FNR==NR {a[$0]++; next} !($0 in a)' file1 file2
6
7
Explication du fonctionnement du code :
- Si nous travaillons sur le fichier 1, suivez chaque ligne de texte que nous voyons.
- Si nous travaillons sur le fichier 2 et que nous n'avons pas vu le texte de la ligne, imprimez-le.
Explication des détails :
FNR
est le numéro d'enregistrement du fichier courantNR
est le numéro d'enregistrement global actuel de tous les fichiers d'entréeFNR==NR
est vrai uniquement lorsque nous lisons le fichier1$0
est la ligne de texte actuellea[$0]
est un hachage avec la clé définie sur la ligne de texte actuellea[$0]++
pistes que nous avons vu la ligne de texte actuelle!($0 in a)
est vrai uniquement lorsque nous n'avons pas vu le texte de la ligne- Imprime la ligne de texte si le modèle ci-dessus renvoie vrai, c'est le comportement par défaut d'awk lorsqu'aucune action explicite n'est donnée