问个 shell 命令文件行提取问题

2019-03-08 10:49:40 +08:00
 shuizhongyu10
两个文件 A,B,A 单列文件,B 多列文件
对 A 中每一行,到 B 中找对应第一列相同的行,提取出来到 C 文件中。
目前我是这样写的:
cat A | awk '{printf("grep %s B>>C\n",$1)}' | bash
但无奈实在有点慢,这里的 B 文件比较大,300w+行,A 文件 10w+行。
老哥们有什么方案能快点的吗?
3238 次点击
所在节点    Linux
26 条回复
shuizhongyu10
2019-03-08 17:31:14 +08:00
@necomancer

while read line
do
look ${line} Bsorted >> C
done < A

我用上面你提供的这个方法,测了这样输出 100 条所用的时间,不知道你要的是不是这个。
放在硬盘和内存里都是 29s 左右。
我系统是 ubuntu,/tmp 并没有挂载在内存上,我通过 mount -t tmpfs -o size=300m tmpfs dir 挂了一块内存来测的。
按道理来说放在内存里应该有提升,不知道是测试的量太小还是哪里出了问题?
hugee
2019-03-08 18:04:26 +08:00
@shuizhongyu10 可以的。然后你说下你的执行时间大概是多少,如果我弄出来效率有提高就告知你。
zclHIT
2019-03-08 18:42:26 +08:00
zclHIT
2019-03-08 18:43:01 +08:00
上面的链接应该就是你要做的吧?
necomancer
2019-03-08 19:16:55 +08:00
@shuizhongyu10 我没处理过那么大量的 A,频繁打开文件确实是瓶颈,无论文件是否在内存里。刚才搜到一个帖子,看到使用 wile read line 本身就是一个很低效的办法,看来 shell 的确不适合直接做这种事...

https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice

...😔
zclHIT
2019-04-15 11:23:01 +08:00
过去了一个月,问个新的问题,反过来要查找文件 a 中所有行,在文件 b 中没有的打印出来到文件 c 应该怎么写呢?

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

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

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

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

© 2021 V2EX