如何使用awk从多个slurm输出文件提取字符串并汇总到单个CSV文件
批量提取slurm日志字段汇总命令调整方案
问题原因
原命令存在三个核心问题:
- 使用全局行号
NR匹配行,处理多文件时行号会持续累加,仅第一个文件的第2、32行能被匹配 - 没有按文件维度输出完整行,字段拼接后缺少换行
- 仅指定单个输入文件,没有遍历所有符合规则的slurm日志
解决方案
1. 先创建输出目录(避免无目录报错)
mkdir -p summary
2. 运行批量处理命令(GNU awk版本,适用于绝大多数Linux环境)
awk ' BEGIN { print "file,reads,file,sample" } # FNR为单文件内部行号,每个新文件会自动重置 FNR == 2 { cur_file = FILENAME outm_val = $18 } FNR == 32 { reads_val = $3 } # 每个文件处理完成后输出一行完整记录 ENDFILE { # 可选:加判断过滤无效文件,避免空行 if (cur_file != "" && outm_val != "" && reads_val != "") { printf "%s,%s,%s,%s,\n", cur_file, outm_val, cur_file, reads_val } # 清空变量避免脏数据带入下一个文件 cur_file = outm_val = reads_val = "" } ' slurm-*.out > summary/total_reads.csv
3. 兼容非GNU awk版本(适用于macOS等环境)
如果运行时提示ENDFILE语法错误,使用以下兼容命令:
awk ' BEGIN { print "file,reads,file,sample" } # 每个新文件开始时输出上一个文件的记录 FNR == 1 && NR > 1 { if (pre_file != "" && outm_val != "" && reads_val != "") { printf "%s,%s,%s,%s,\n", pre_file, outm_val, pre_file, reads_val } pre_file = outm_val = reads_val = "" } FNR == 2 { pre_file = FILENAME outm_val = $18 } FNR == 32 { reads_val = $3 } # 所有文件处理完后输出最后一个文件的记录 END { if (pre_file != "" && outm_val != "" && reads_val != "") { printf "%s,%s,%s,%s,\n", pre_file, outm_val, pre_file, reads_val } } ' slurm-*.out > summary/total_reads.csv
调整说明
- 自动遍历当前目录下所有文件名符合
slurm-*.out规则的输入文件,不需要逐个指定 - 按单个文件维度缓存需要提取的字段,避免跨文件取值混乱
- 每个文件处理完成后输出完整一行数据,自动补全换行
- 可选校验逻辑自动过滤行数不足、字段缺失的无效日志文件
内容的提问来源于stack exchange,提问作者abs
相关产品推荐
相关产品推荐

