Linux下使用awk提取列并添加计算新列的问题求助
问题:使用awk提取指定列并新增计算列的正确实现
原始文件内容
ID Grade1 Grade2 Grade3 JK01 92 84 88 JK02 87 80 93 JK03 89 98 95
需求说明
提取ID、Grade2列,新增两列:
- Weight:由
Grade2 * 1.5 + 2计算得出 - Note:固定为数值17
期望输出(注:原示例中JK01的Weight应为128,属于笔误,以下按正确计算逻辑展示):
ID Grade2 Weight Note JK01 84 128 17 JK02 80 122 17 JK03 98 149 17
你之前的问题分析
第一个命令未区分表头和数据行:
awk '{print $1,$3,$3*1.5+2, 17}' file.txt > file.tem.txt表头行的
$3是字符串Grade2,awk会将其视为0计算,导致表头出现2而非Weight。第二个命令格式错误:
awk -F, '{print $1,$3,"Weight", "Note"; next} {print $0,$2*1.5+2,17}' file.txt > file.tem.txt用
-F,指定逗号分隔符,但原始文件是空格分隔,导致列识别错误;同时数据行输出整行再加计算列,不符合提取指定列的需求。
正确解决方案
方案1:保持列对齐(推荐,匹配期望输出格式)
使用printf控制列宽,区分表头和数据行处理:
NR==1 {printf("%6s %8s %7s %5s\n", $1, $3, "Weight", "Note"); next} {printf("%6s %8d %7d %5d\n", $1, $3, $3*1.5+2, 17)}
执行命令:
awk 'NR==1 {printf("%6s %8s %7s %5s\n", $1, $3, "Weight", "Note"); next} {printf("%6s %8d %7d %5d\n", $1, $3, $3*1.5+2, 17)}' file.txt > file.tem.txt
NR==1:判断当前是第一行(表头),打印自定义表头并通过next跳过后续处理printf格式符:%6s表示占6个字符宽度的字符串,%8d表示占8个字符宽度的整数,保证列对齐
方案2:简单无对齐输出
如果不需要严格对齐,可简化为:
NR==1 {print $1, $3, "Weight", "Note"; next} {print $1, $3, $3*1.5+2, 17}
执行命令:
awk 'NR==1 {print $1, $3, "Weight", "Note"; next} {print $1, $3, $3*1.5+2, 17}' file.txt > file.tem.txt
内容的提问来源于stack exchange,提问作者mashimena
相关产品推荐
相关产品推荐

