如题有一个文件 a ,只有一列存着 id
文件 b 是 3 列,存着 id 和其他字段
想找到文件 b 中 id 为文件 a 中的 id 的所有行
大佬们除了遍历还有什么其他的方法吗,因为文件 b 的行数大概有 2 亿。。。哭死
文件 b 是 3 列,存着 id 和其他字段
想找到文件 b 中 id 为文件 a 中的 id 的所有行
大佬们除了遍历还有什么其他的方法吗,因为文件 b 的行数大概有 2 亿。。。哭死

1 macy Dec 7, 2022 没想到啥好办法,遍历是肯定的,如果后面长期查找,可以尝试把文件存到数据库里吧 |
2 Shinoda Dec 7, 2022 可以用用 command line 试试? 比如 grep -Fwf a.txt b.txt 之类的? 假设你只有 a.txt 只有 id |
3 dqzcwxb Dec 7, 2022 读到内存改成 map 优化成 O(1)去匹配,内存不够就读一半还不够就再分一半用分治法解决 |
4 chaleaochexist Dec 7, 2022 好像有个布隆过滤器 精度要求不高的情况下可以考虑. redis 就支持. |
5 xiaolinjia Dec 7, 2022 问了下 chatgpt 。 可以使用 Linux 的 grep 命令来找到两个文件的并集。 假设文件 a 的内容如下: 1 2 3 4 文件 b 的内容如下: 1,foo,bar 2,hello,world 5,foo,baz 6,hello,world 要找到文件 b 中 id 为文件 a 中的 id 的所有行,可以使用以下命令: grep -f a b 这将输出文件 b 中与文件 a 中的 id 匹配的行,即: 1,foo,bar 2,hello,world 上面的命令中,-f 选项告诉 grep 使用文件 a 作为搜索模式。您可以使用 -w 选项来仅匹配整个单词,而不是部分单词。 例如,如果文件 a 的内容如下: hello world 那么使用 -w 选项的命令将输出: 2,ello,world 6,hello,world 但是,如果不使用 -w 选项,命令将输出所有包含文件 a 中的单词的行,即: 1,foo,bar 2,hello,world 5,foo,baz 6,hello,world 因此,要根据需要使用 -w 选项。 |
7 kkyypy OP |
8 rekulas Dec 7, 2022 遍历是必须的,毕竟总得访问才能对比,就算用工具内部也是遍历。。 awk 实现比较方便 |
9 winglight2016 Dec 7, 2022 命令行能处理这么大的文件?如果是长期任务,可以考虑用 spark ,也就几行代码 |
10 wxf666 Dec 7, 2022 俩文件有多大呢? 文件 a 较小的话(内存存得下),如 8 楼所说,一两行 awk 应该就行了 @winglight2016 就 2 亿数据,感觉一个几百 KB 的 SQLite 都能很好应对,不必要上大数据平台吧 |
11 TimePPT PRO 啥文件?量大可以导入数据库,量小,除了 LS 的办法,如果类 csv ,可以试试 csvq https://github.com/mithrandie/csvq |
12 zthxxx Dec 7, 2022 假设有一个名为 `file_a.txt` 的文件,包含一列 id ,另一个名为 `file_b.txt` 的文件包含 3 列,第一列为 id ,可以使用以下命令找到 `file_b.txt` 中 id 为 `file_a.txt` 中的 id 的所有行: ``` grep -f file_a.txt file_b.txt ``` 这将在 `file_b.txt` 中搜索与 `file_a.txt` 中的 id 匹配的行,并输出这些行。 |
13 littlewing Dec 7, 2022 导入数据库 |
14 garyox64 Dec 7, 2022 grep 就支持,就是 chatgpt 回答的用法,具体选项可以自己再研究下 看来这个 chatgpt 有点厉害啊,我得去研究下 |
15 Tanix2 Dec 7, 2022 没有其他假设的话,b 文件肯定要遍历,如果有一行没遍历,该行 id 可能在 a 中,这就少算了一个结果了。 如果 b 中 id 是有规律的,比如有序,那么可以不遍历,比如可以二分查找。 |
16 Tanix2 Dec 7, 2022 这个是交集,因为你要求的是 a 、b 共有的。 |
17 lululau Dec 7, 2022 grep -Ff a.txt b.txt # 前提是 ID 列的值不会碰巧被包含在其他列中 不遍历的话,估计这个需求只有上帝能做了 |
18 lance6716 Dec 7, 2022 via Android 手撸一个 SQL join 算子,很有前途 |
19 lightjiao Dec 8, 2022 多线程排序遍历( doge ) |
21 ruidoBlanco Dec 8, 2022 join a.txt b.txt 如果分隔符不是空格或者需要匹配的字段不是第一个,man join 自己查。 |
22 julyclyde Dec 8, 2022 comm 命令 要加参数 |
23 libook Dec 8, 2022 拿 Python 之类的写个脚本实现吧,用 shell 调用执行,shell 自己处理这种 case 可能十分吃力,毕竟 shell 只是个用来启动其他程序的工具。 |
24 jurassic2long Dec 8, 2022 还是上数据库吧,sqlite 就行,免去了各种细节问题,操作简单,计算高效 |
25 wxf666 Dec 8, 2022 @ruidoBlanco @julyclyde `join` 和 `comm` 命令都要求 a.txt 和 b.txt 排好序了吧。。 如果俩文件都排好序了的话,反而没必要遍历 b.txt 了。如 @Tanix2 #16 所说,用二分查找更快 |
26 sparkssssssss Dec 8, 2022 假定 a 的第一列是 id, b 的第一列也是 id,如果不是,修改以下 $1,如果 b 的 id 不固定,则忽略这个回答. awk 'NR==FNR {a[$1];next} $1 in a' a b |
27 xyjincan Dec 8, 2022 A 文件进内存,B 文件逐行输出,程序也许一分钟就跑完了 |
29 lizuoqiang Dec 8, 2022 join -t , a.txt b.txt |