如何比较两个文件中的数据以识别公共数据和唯一数据?

如何比较两个文件中的数据以识别公共数据和唯一数据?

如何比较两个文件中的数据以识别通用数据和唯一数据?我无法逐行执行此操作,因为我有文件 1,其中包含 100 个 id/codes/number-set,我想将文件 2 与文件 1 进行比较。

事实是,文件 2 包含文件 1 中的数据子集以及文件 2 独有的数据,例如:

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

我如何比较两个文件以识别每个文件中共有和唯一的数据?diff似乎无法完成这项工作。

答案1

无论你的 file1 和 file2 是否排序,使用命令如下:

file1 中的唯一数据:

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

file2 中的唯一数据:

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

公共数据:

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

解释:

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"

答案2

这是什么comm适用于:

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

第一列是仅出现在文件 1 中的行
第二列是仅出现在文件 2 中的行
第三列是两个文件共有的行

comm要求对输入文件进行排序

排除任何列出现,请添加带有该列号的选项。例如,要仅查看共有的行,请使用comm -12 ...或仅在 file2 中出现的行,comm -13 ...

答案3

xxdiff如果您只需要以图形方式查看两个文件(或目录)之间的变化,那么这是无与伦比的:

在此处输入图片描述

与常规diff和一样comm,您的输入文件应该首先排序。

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

相关内容