如何在Linux Shell中并行执行命令块并按序将输出写入文件
实现方案
核心思路是给输入文件的每一行分配唯一序号,并行执行命令块时将输出写入对应序号的临时文件,所有任务执行完成后按序号拼接临时文件到最终输出文件,即可保证输出顺序与输入行顺序完全一致。
完整原生Shell实现(无需额外依赖)
#!/bin/bash INPUT_FILE="file.txt" OUTPUT_FILE="output.txt" # 创建唯一临时目录避免文件冲突 TMP_DIR=$(mktemp -d /tmp/parallel_exec.XXXXXX) # 清空目标输出文件 > "$OUTPUT_FILE" line_num=0 # 遍历输入文件每一行,兼容空格、特殊字符和末尾无换行的场景 while IFS= read -r line || [[ -n "$line" ]]; do line_num=$((line_num + 1)) # 后台启动子进程执行命令块,输出写入对应行号的临时文件 ( # 替换为你实际要执行的命令,$line为当前读取的行内容 Execute A "$line" Execute B "$line" Execute C "$line" > "$TMP_DIR/${line_num}.out" ) & done < "$INPUT_FILE" # 等待所有后台任务全部执行完成 wait # 按行号顺序拼接所有临时输出到最终文件 for ((i=1; i<=line_num; i++)); do cat "$TMP_DIR/${i}.out" >> "$OUTPUT_FILE" done # 清理临时目录 rm -rf "$TMP_DIR"
简化方案(需安装GNU Parallel)
如果你的系统已安装parallel包,可以直接用内置的顺序输出参数,无需手动管理临时文件:
parallel --keep-order 'Execute A {}; Execute B {}; Execute C {}' :::: file.txt > output.txt
其中--keep-order参数会强制输出顺序和输入顺序完全一致,自动处理并行调度和输出排序逻辑。
内容的提问来源于stack exchange,提问作者user3595106
相关产品推荐
相关产品推荐

