昨天有个同事问我一个问题,在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 转载需授权!