如何使用Bash脚本将数百万行的文本文件转换为MongoDB插入查询
用Bash脚本将百万行数字文本转换为MongoDB插入语句
刚好处理过类似的大规模数据导入需求,用Bash脚本完全可以搞定,而且要兼顾效率和格式的正确性——毕竟是百万行数据,格式错一个逗号都可能导致MongoDB执行失败。下面给你两个实用的方案,按需选择:
方案一:Sed + Echo 组合(简单易读)
这个方案逻辑直观,适合快速上手,通过Sed做文本替换,配合Echo拼接前后的MongoDB语句框架:
#!/bin/bash # 替换为你的输入文件路径 INPUT_FILE="numbers.txt" # 替换为你的目标集合名称 COLLECTION_NAME="database_name" # 输出插入语句的开头部分 echo "db.${COLLECTION_NAME}.insert([" # 将每行数字转换为指定格式,最后一行去掉末尾逗号 sed -e 's/^/ { "number":"&" },/' "$INPUT_FILE" | sed '$s/,$//' # 输出插入语句的结尾部分 echo "]);"
逻辑说明:
- 第一个
sed命令:把每行开头的数字,替换成{ "number":"数字" },的格式; - 第二个
sed命令:专门处理最后一行,去掉末尾的逗号(MongoDB不允许数组最后一个元素带逗号); - 用
echo拼接插入语句的首尾框架,完成整体格式。
方案二:Awk 实现(高效处理超大规模文件)
如果你的文件真的有数百万行,Awk会是更优选择——它只需要遍历文件一次,内存占用极低,处理速度比两次Sed的组合快很多:
#!/bin/bash INPUT_FILE="numbers.txt" COLLECTION_NAME="database_name" # 输出开头框架 echo "db.${COLLECTION_NAME}.insert([" # Awk逐行处理生成格式内容 awk ' BEGIN { first_line = 1 } { # 从第二行开始,先输出逗号分隔符 if (!first_line) print "," # 格式化输出当前行的数字 printf " { \"number\":\"%s\" }", $0 first_line = 0 } END { # 输出结尾框架,确保格式闭合 print "\n]);" } ' "$INPUT_FILE"
逻辑说明:
BEGIN块初始化标记,标记第一行不需要前置逗号;- 遍历每行时,非第一行先输出逗号,再打印格式化后的对象;
END块输出结尾的闭合语句,确保整个插入语句格式正确。
实用小贴士
- 性能优化:百万级文件优先选Awk方案,避免两次遍历文件带来的时间损耗;
- 输出到文件:如果需要生成可直接执行的MongoDB脚本,可将脚本输出重定向到文件:
./convert_script.sh > insert_data.js,之后用mongo your_database insert_data.js执行; - 参数替换:记得把脚本里的
numbers.txt和database_name替换成你实际的文件路径和集合名称; - 特殊字符处理:如果你的数字行里包含特殊字符(虽然题目里是纯数字),可以在Awk的
printf里添加转义逻辑,比如处理双引号。
内容的提问来源于stack exchange,提问作者Mihiran Chathuranga
相关产品推荐
相关产品推荐

