Linux 中如何找到 2 个文件的并集

2022-12-07 15:54:36 +08:00
 kkyypy
如题有一个文件 a ,只有一列存着 id
文件 b 是 3 列,存着 id 和其他字段
想找到文件 b 中 id 为文件 a 中的 id 的所有行

大佬们除了遍历还有什么其他的方法吗,因为文件 b 的行数大概有 2 亿。。。哭死
2736 次点击
所在节点    Linux
29 条回复
ruidoBlanco
2022-12-08 04:44:45 +08:00
join a.txt b.txt

如果分隔符不是空格或者需要匹配的字段不是第一个,man join 自己查。
julyclyde
2022-12-08 08:36:50 +08:00
comm 命令
要加参数
libook
2022-12-08 10:11:27 +08:00
拿 Python 之类的写个脚本实现吧,用 shell 调用执行,shell 自己处理这种 case 可能十分吃力,毕竟 shell 只是个用来启动其他程序的工具。
jurassic2long
2022-12-08 10:30:31 +08:00
还是上数据库吧,sqlite 就行,免去了各种细节问题,操作简单,计算高效
wxf666
2022-12-08 11:05:26 +08:00
@ruidoBlanco @julyclyde `join` 和 `comm` 命令都要求 a.txt 和 b.txt 排好序了吧。。

如果俩文件都排好序了的话,反而没必要遍历 b.txt 了。如 @Tanix2 #16 所说,用二分查找更快
coolloves
2022-12-08 11:46:18 +08:00
假定 a 的第一列是 id, b 的第一列也是 id,如果不是,修改以下 $1,如果 b 的 id 不固定,则忽略这个回答.

awk 'NR==FNR {a[$1];next} $1 in a' a b
xyjincan
2022-12-08 12:50:03 +08:00
A 文件进内存,B 文件逐行输出,程序也许一分钟就跑完了
julyclyde
2022-12-08 14:37:40 +08:00
@wxf666 是的要求排序。
lizuoqiang
2022-12-08 17:57:59 +08:00
join -t , a.txt b.txt

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

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

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

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

© 2021 V2EX