如何将含超长行的文本文件逐行传递给脚本处理?
处理超长行的逐行脚本调用方案
针对数MiB级的超长行无法用read命令处理的场景,可以用awk直接逐行读取输入,通过管道将每行内容传递给目标脚本,全程无需创建临时文件,效率远高于split的临时文件方案:
awk '{print | "./process.sh"; close("./process.sh")}' input.txt
关键说明
awk原生支持按行解析输入,不受行长度限制,能完整读取超长行内容,不会像read命令因内存或变量长度限制失效。print | "./process.sh"将当前行内容通过管道传递给process.sh执行;close("./process.sh")是核心:如果不关闭管道,awk会复用同一个管道,导致process.sh持续等待输入而不执行;关闭管道后,awk会为每一行启动一个独立的process.sh进程,实现真正的逐行调用。- 相比
split创建临时文件的方式,该方案全程在内存管道中传递数据,彻底避免磁盘IO开销,速度大幅提升。
输入流适配
如果输入来自标准流(比如其他命令的输出管道),直接将输入传给awk即可:
your_command | awk '{print | "./process.sh"; close("./process.sh")}'
备选写法(需注意特殊字符)
如果偏好更直观的命令调用方式,可使用awk的system函数,但要注意行内容包含引号、反斜杠等特殊字符时可能出现转义问题,因此优先推荐管道方案:
awk '{system("printf \"%s\\n\" \"" $0 "\" | ./process.sh")}' input.txt
内容的提问来源于stack exchange,提问作者Christoph Walesch
相关产品推荐
相关产品推荐

