如何让GNU Parallel将每行通过stdin传递给base64编码?
解决每行Base64编码的GNU Parallel用法问题
要实现对文件每行单独进行Base64编码,你不需要使用--pipe选项——这个选项本来就是为大块数据并行处理设计的,默认按1MB分割的行为正是你遇到的问题根源。直接利用GNU Parallel的行处理能力即可,以下是两种可靠方案:
方案1:直接每行调用Base64
cat alphanum.txt | parallel 'echo -n {} | base64'
echo -n {}:将当前行内容({}代表Parallel读取的每一行)作为输入传给base64,-n避免额外添加换行符(防止编码结果包含原始行末换行的Base64值)。- 这种方式会为每行启动一个
base64进程,适合行数不多或对并行度要求不高的场景。
方案2:高效批量行处理(适合大文件)
如果你的文件行数极多,频繁启动进程会有性能损耗,可以用--pipe配合行分割标记强制按行切块:
cat alphanum.txt | parallel --pipe --recend '\n' -L1 base64
--recend '\n':告诉Parallel以换行符作为块的结束标记,确保每个块恰好是一行。-L1:进一步限制每个块最多1行,双重保证分割逻辑。- 这种方式会将多行打包给少量
base64进程处理,但base64会自动为每行生成独立的编码结果。
为什么之前的参数无效?
-L 1/-l 1:单独使用时,若你的行长度远小于1MB,Parallel仍可能将多行合并为一个1MB块,因为--pipe的块大小优先级高于行限制。--line-buffered:这是控制输出缓冲的参数,不影响输入块的分割逻辑,所以对你的问题无效。
内容的提问来源于stack exchange,提问作者J Heschl
相关产品推荐
相关产品推荐

