大文件中的字符串替换

大文件中的字符串替换

我有两个 TSV(制表符分隔值)文件——file_A.txt以及file_B.txt

file_A.txt包含两列 -- A_ID,A_Name

file_B.txt包含 4 列 -- B_ID1, B_Name1, B_ID2,B_Name2

需要遍历每个A_ID,如果匹配B_ID1或,则相应地B_ID2替换B_Name1或。B_Name2A_Name

我正在寻找一种有效的方法,因为file_B只有几百 MB。

有什么建议吗?

答案1

假设您想要 file_B.txt 格式的替换,正如 Spike 建议的那样,像 sqlite 这样的轻量级数据库可以做到这一点。

以下代码将 file_A.txt 和 file_B.txt 读入临时内存数据库并将结果输出到 TSV 文件MODIFIED-file_B.txt

sqlite3 -separator $'\t' << EOF  > MODIFIED-file_B.txt
CREATE TABLE a ( id INTEGER PRIMARY KEY, name );
.import file_A.txt a
CREATE TABLE b (id1 INTEGER,name1 TEXT,id2 INTEGER,name2 TEXT);
.import file_B.txt b
SELECT b.id1,
       ifnull((SELECT name from a WHERE a.id=b.id1),b.name1),
       b.id2, 
       ifnull((SELECT name from a WHERE a.id=b.id2),b.name2)
FROM b;
EOF

这会将每个文件读取到一个单独的表中,然后输出带有 A 替换的 b 表(如果可用),否则返回原始 B_name。

如果内存使用是一个问题,您可以使用文件名运行它,例如sqlite3 -separator $'\t' temporary.db创建一个临时文件。

相关内容