请教linux下面的一个命令,或者命令组合?

2013-03-15 15:58:12 +08:00
 Tinet
这两天在工作的时候遇到这样一个问题:
两个文本文件,数据是一行一行放的,我想查看文件A中哪些行是文件B中没有的,自己也找了一些,感觉达不到目的,总觉得那些程序是按两个文件中相同的行在比较(具体不清楚,求指教)但是我要的效果是把文件A中的一行挨个去和B中的每一行进行比较,看有没有相同的,直到把A中的所有行比较完,最后输出A中那些在B中不存在的行。
不知道我的问题有没有描述清楚,大家给我点建议吧,你们在遇到这种问题的时候是怎么解决的?
2988 次点击
所在节点    问与答
7 条回复
yangg
2013-03-15 16:20:06 +08:00
如果没顺序就是
cat a.txt | while read line; do grep "$line" b.txt > /dev/null || echo $line; done

有顺序的话直接diff吧
yangg
2013-03-15 16:22:57 +08:00
修正下,整行相同,而不是匹配

cat a.txt | while read line; do grep "^$line$" b.txt > /dev/null || echo $line; done
Tinet
2013-03-15 16:36:10 +08:00
@yangg 如果不想区分大小写呢
clww
2013-03-15 16:40:15 +08:00
@Tinet grep加-i开关
Tinet
2013-03-15 16:49:13 +08:00
@yangg 我试了一下,A中和B相同的行也被输出了,有点问题
swulling
2013-03-15 16:55:58 +08:00
需求:找出文件a中哪些行是文件b中没有的

方案1:
@yangg 的方法,没有对grep做任何参数限制,几千行对比就会很慢了。。而且为啥一长串?
正确方法是 cat a | grep -vFf b
如果不区分大小写,加-i参数即可

方案2:
如果数据量到达1000w以上,你会发现grep会把内存打满,无法使用
用awk即可

输出a和b的相同行
awk 'ARGIND==1{a[$0]} ARGIND>1&&($0 in a){print $0}' a b > same.out

输出文件a中哪些行是文件b中没有的
awk 'ARGIND==1{a[$0]} ARGIND>1&&!($0 in a){print $0}' a b > a-b.out
swulling
2013-03-15 16:59:22 +08:00
P.S awk内存占用约等于文件a的行数*awk内置hash长度(64bit=8Byte?记不太清楚了)

性能大约是1000w的a和1000w的b对比,几分钟,而且时间和内存占用是和行数线性相关的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/63033

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX