我有 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