t06 shell比较两个文件的差异(差集)

昨天有个同事问我一个问题,在shell中如何比较两个文件的差异.想找出A文件中没有在B文件里面出现的记录
两个文件一个是这样的格式:
A文件:
Url : http://abc.com
Url : http://bcd.com/bcd
Url : http://def.com/def/def
B文件:

http://abc.com

http://bcd.com/bcd

这个同事写了一长段的AWK语句,但是发现并不奏效.
于是我用了这样的方式:
1. 将A文件变成和B文件相同的格式

awk '{print $3}' A > A.txt

于是A文件中也是每行一个单独的URL了.

2.

sort A.txt B B ¦ uniq -u

这个是啥意思呢,如果有记录在A中有,比如记录为a,在B中没有出现,那么sort A.txt B B,即把B的内容重复了两次之后排序,得到的结果肯定还是只有一行a.因此uniq -u就会把它拿出来(uniq -u只输出未重复的行).而如果在B中出现了的话,结果中至少就会有两行相同的记录,uniq -u就不会输出它.

这样的结果就是A中出现,B中未出现的了.
这样的思路很简单,但是发现结果也并不是我们想要的.
预期的输出大概只有几十行,但是实际上输出了上万行,比A,B原来的行数更多.
这是咋回事儿?
肉眼比较了一下,感觉不应该啊.

3. 突然想到,有可能是格式不一致.
-rw-rw-r– 1 work work 403589 3?? 28 10:55 A.txt
-rw-r–r– 1 work work 389329 3?? 27 16:32 B
按理说只有几十行的差异,大小不会相差这么大啊.灵机一动想到可能是dos和unix格式不统一造成的(换行符分别是\n\r和\n).
file了一下,结果是这样的:
A.txt: ASCII text, with CRLF line terminators
B: ASCII text
果然A的换行符有问题..是dos格式的.
因此使用dos2unix A.txt命令,将A.txt变成unix格式.
然后使用2中的命令,果然正确啦!


本文链接:https://www.poisonbian.com/post/56.html 转载需授权!

分享到:
原文链接:,转发请注明来源!
「t06 shell比较两个文件的差异(差集)」评论列表

发表评论