web-dev-qa-db-fra.com

Comment puis-je comparer des données dans 2 fichiers pour identifier des données communes et uniques?

Comment comparer des données dans 2 fichiers pour identifier des données communes et uniques? Je ne peux pas le faire ligne par ligne car j'ai le fichier 1 qui contient 100 id/codes/number-set et je veux comparer un fichier 2 à un fichier 1.

Le problème est que le fichier 2 contient un sous-ensemble de données dans le fichier 1 et également des données uniques au fichier 2, par exemple:

file 1      file 2
1            1
2            a
3            2
4            b
5            3 
6            c

Comment comparer les deux fichiers pour identifier les données communes et uniques pour chaque fichier? diff n'arrive pas à faire le travail.

4

Ceci est ce que comm est pour:

$ comm <(sort file1) <(sort file2)
        1
        2
        3
4
5
6
    a
    b
    c

La première colonne contient uniquement les lignes figurant dans le fichier 1.
La deuxième colonne contient les lignes figurant uniquement dans le fichier 2.
La troisième colonne contient les lignes communes aux deux fichiers.

comm nécessite que les fichiers d'entrée soient triés

Pour exclure toute colonne de l’apparition, ajoutez une option avec ce numéro de colonne. Par exemple, pour afficher uniquement les lignes communes, utilisez comm -12 ... ou les lignes figurant uniquement dans le fichier 2, comm -13 ....

5
glenn jackman

Que vos fichiers1 et 2 soient triés ou non, utilisez la commande awk comme suit:

données uniques dans fichier1:

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

données uniques dans file2:

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

données communes:

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

Explication:

NR==FNR    - Execute next block for 1st file only
a[$0]      - Create an associative array with key as '$0' (whole line) and copy that into it as its content.
next       - move to next row
($0 in a)  - For each line saved in `a` array:
             print the common lines from 1st and 2nd file "($0 in a)' file1 file2"
             or unique lines in 1st file only "!($0 in a)' file2 file1"
             or unique lines in 2nd file only "!($0 in a)' file1 file2"
5
αғsнιη

xxdiff ne correspond pas si vous avez juste besoin de voir graphiquement les changements entre deux fichiers (ou répertoires!):

enter image description here

Comme avec diff et comm, vos fichiers d'entrée doivent être triés en premier.

sort file1.txt > file1.txt.sorted
sort file2.txt > file2.txt.sorted
xxdiff file1.txt.sorted file2.txt.sorted
0
whereisalext