You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:06:06