上面提到的 awk/grep 解决方案在我的机器上运行缓慢或内存不足(file1 10^6 行,file2 10^7 行)。所以我想出了一个使用 sqlite3 的 SQL 解决方案。
将 file2 转换为 CSV 格式的文件,其中第一个字段是后面的值ri=
cat file2.txt | gawk -F= '{ print $3","$0 }' | sed 's/;,/,/' > file2_with_ids.txt
创建两个表:
sqlite> CREATE TABLE file1(rowId char(10));
sqlite> CREATE TABLE file2(rowId char(10), statement varchar(200));
从 file1 导入行 ID:
sqlite> .import file1.txt file1
使用“准备好的”版本从 file2 导入语句:
sqlite> .separator ,
sqlite> .import file2_with_ids.txt file2
file2
选择 table中具有匹配 rowId 的所有语句file1
:
sqlite> SELECT statement FROM file2 WHERE file2.rowId IN (SELECT file1.rowId FROM file1);
可以通过在发出 select 语句之前将输出重定向到文件来轻松创建文件 3:
sqlite> .output file3.txt
测试数据:
sqlite> select count(*) from file1;
1000000
sqlite> select count(*) from file2;
10000000
sqlite> select * from file1 limit 4;
1610666927
1610661782
1610659837
1610664855
sqlite> select * from file2 limit 4;
1610665680|update TABLE_X set ATTRIBUTE_A=87 where ri=1610665680;
1610661907|update TABLE_X set ATTRIBUTE_A=87 where ri=1610661907;
1610659801|update TABLE_X set ATTRIBUTE_A=87 where ri=1610659801;
1610670610|update TABLE_X set ATTRIBUTE_A=87 where ri=1610670610;
在没有创建任何索引的情况下,选择语句在 AMD A8 1.8HGz 64 位 Ubuntu 12.04 机器上花费了大约 15 秒。