diff 给出的是完全不同的结果,但人类的比较却显示相等

diff 给出的是完全不同的结果,但人类的比较却显示相等

我有 2 个文件:

2       m1.small
1       m3.large
2       m3.medium
2       t1.micro
1       t2.large
7       t2.medium
4       t2.micro
7       t2.small

和 b:

1       c4.2xlarge
1       c4.large
2       m1.small
1       m3.large
3       m3.medium
1       m4.large
3       t1.micro
3       t2.large
11      t2.medium
7       t2.micro
7       t2.small

当我使用 sdiff 时,结果完全不同:

$ sdiff a b
2       m1.small           | 1       c4.2xlarge
1       m3.large           | 1       c4.large
2       m3.medium          | 2       m1.small
2       t1.micro           | 1       m3.large
1       t2.large           | 3       m3.medium
7       t2.medium          | 1       m4.large
4       t2.micro           | 3       t1.micro
7       t2.small           | 3       t2.large
                           > 11      t2.medium
                           > 7       t2.micro
                           > 7       t2.small

而我可以清楚地看到至少

2       m1.small
1       m3.large
7       t2.small

为什么会这样,我能做些什么来优化从 diff 获得的结果。

我也尝试过使用 meld(windows diff 工具),它给出了完全相同的结果。

答案1

差异类型实用程序将逐行比较文件,而您似乎对两个文件是否有共同的行感兴趣。

通信实用程序可能就是您正在寻找的,但是文件需要一些预处理(字段顺序和排序):

cat a | awk '{ print $2 " " $1}' | sort > as
cat b | awk '{ print $2 " " $1}' | sort > bs

然后你可以执行通信:

comm as bs

它给出 3 列输出(位于左侧字段、右侧字段或两者中):

        c4.2xlarge 1
        c4.large 1
                m1.small 2
                m3.large 1
m3.medium 2
        m3.medium 3
        m4.large 1
t1.micro 2
        t1.micro 3
t2.large 1
        t2.large 3
        t2.medium 11
t2.medium 7
t2.micro 4
        t2.micro 7
                t2.small 7

也可以仅发出在左侧文件(comm -2 -3)或右侧文件(comm -1 -3)等中出现的行。

我认为这与您所追求的结果非常接近。


其实这个问题看起来和https://stackoverflow.com/questions/373810/unix-command-to-find-lines-common-in-two-files

可以在那里找到另一种解决方案comm,即使用 awk 识别公共行。我在这里重现它,因为它非常优雅:

awk 'NR==FNR{arr[$0];next} $0 in arr' a b

相关内容