如何使用awk移除指定字段冗余内容 提取首个gres/gpu后的数值
awk提取AllocTres字段GPU值实现
测试文件准备
执行vi test.text创建测试文件,文件共3列,由前置awk管道生成,存在空字段,内容如下:
Index AllocTres CPUTotal 1 cpu=1,mem=256G 18 2 cpu=2,mem=1024M 16 3 4 4 cpu=12,gres/gpu=3 12 5 8 6 9 7 cpu=13,gres/gpu=4,gres/gpu:ret6000=2 20 8 mem=12G,gres/gpu=3,gres/gpu:1080ti=1 21
处理规则
- 过滤第二列(AllocTres)中所有
cpu=、mem=开头的键值对 - 仅保留第一个无后缀的
gres/gpu=后跟随的数值,其余带冒号后缀的GPU相关条目全部丢弃 - 原空字段保留空值,输出3列的对齐格式和原文件保持一致
实现命令
直接运行如下管道命令即可得到结果:
cat test.text | awk ' # 首行表头直接原样输出 NR==1 {print; next} { gpu_num = "" # 正则匹配第一个gres/gpu=后的整数,自动忽略带冒号的后缀条目 if (match($0, /gres\/gpu=([0-9]+)/, match_res)) { gpu_num = match_res[1] } # 按原列宽格式化输出,%-Ns的N对应列占位宽度,可根据实际文件调整 printf "%-6s %-38s %s\n", $1, gpu_num, $NF }'
输出结果
执行后输出和预期完全一致:
Index AllocTres CPUTotal 1 18 2 16 3 4 4 3 12 5 8 6 9 7 4 20 8 3 21
如果实际文件的列宽和示例不同,调整printf语句中%-38s的数字即可,数字越大第二列占位越宽。
内容的提问来源于stack exchange,提问作者Jingnan Jia
相关产品推荐
相关产品推荐

