如何使用awk提取指定关键词后的数字并新增列格式化输出
awk提取指定字段后数字实现方案
直接执行以下管道命令即可输出符合要求的4列结果,自动适配空字段场景,不会出现列错位:
cat test.text | awk ' # 处理第一行表头 NR==1 { first_col = $1 last_col = $NF mid_col = $0 sub("^[[:space:]]*" first_col "[[:space:]]+", "", mid_col) sub("[[:space:]]+" last_col "[[:space:]]*$", "", mid_col) printf "%-6s %-38s %-10s %s\n", first_col, mid_col, last_col, "GPUAllocated" next } # 处理数据行 { gpu_val = 0 # 匹配行内第一个gres/gpu=后紧跟的数字 if (match($0, /gres\/gpu=([0-9]+)/, match_res)) { gpu_val = match_res[1] } first_col = $1 last_col = $NF mid_col = $0 sub("^[[:space:]]*" first_col "[[:space:]]+", "", mid_col) sub("[[:space:]]+" last_col "[[:space:]]*$", "", mid_col) printf "%-6s %-38s %-10s %s\n", first_col, mid_col, last_col, gpu_val }'
逻辑说明
- 列拆分逻辑:自动识别每行第一个字段为Index列、最后一个字段为CPUTotal列,两列中间的所有内容为AllocTres列,即使AllocTres为空也不会错位
- 匹配逻辑:通过正则匹配行内第一次出现的
gres/gpu=关键词,提取后面紧跟的连续整数,不会误识别gres/gpu:xxx=这类带冒号后缀的同类条目 - 默认值:行内不存在目标关键词时,GPUAllocated列默认赋值为0
- 输出格式:和原文件列宽对齐,不破坏原有排版
执行后输出结果和预期完全一致:
Index AllocTres CPUTotal GPUAllocated 1 cpu=1,mem=256G 18 0 2 cpu=2,mem=1024M 16 0 3 4 0 4 cpu=12,gres/gpu=3 12 3 5 8 0 6 9 0 7 cpu=13,gres/gpu=4,gres/gpu:ret6000=2 20 4 8 mem=12G,gres/gpu=3,gres/gpu:1080ti=1 21 3
内容的提问来源于stack exchange,提问作者Jingnan Jia
相关产品推荐
相关产品推荐

