我有一个场景,我想计算列的总和
SAL|CAL|TAG|VAL
12.11"|"1.1"|"2.1"|"1.1
13.11"|"1.1"|"2.2"|"2.2
14.11"|"1.1"|"2.4"|"2.4
我的下面的代码没有给出输出,输出为 0.00
我需要此列 CAL VAL 的输出
awk -F'|' '{T+=$2} END { printf "%.2f\n", T }' demo.txt
输出 :
6.7 5.7
答案1
文件中的分隔符不一致(|
标题行中为普通分隔符,但"|"
其后为分隔符),或者分隔符一致|
但字段引用不一致(缺少"
第一个字段的打开字段和"
最后一个字段的闭合字段)。
无论哪种方式,当您设置 时-F'|'
, 的值$2
都会被解析为字符串,就像"1.1"
当您尝试对它们执行加法时会转换为数字值零一样。
如果您的 awk 系统版本支持字段分隔符的正则表达式,您可以改为使用-F'"?\\|"?'
允许(文字)|
具有可选的前导和尾随引号:
$ awk -F'"?\\|"?' '{T+=$2} END { printf "%.2f\n", T }' demo.txt
3.30
答案2
从预期的输出来看,您似乎添加了 TAG 和 VAL 列。
我注意到您输入的 CSV 无效。您不能引用字段,例如 12.11,也可以引用字段,例如“12.11”。半引用它们是无效的。
有两种方法可以做到这一点,包括避免从列标题中添加“数字”值。 (这些都没有经过测试。)
(a) 定义一个字段分隔符以符合实际情况。
awk '-F"[|]"' 'NR == 1 { next; }
{ T3 += $3; T4 += $4; }
END { printf ("T3 %.2f T4 %.2f\n", T3, T4); }'
(b) 在使用每个字段之前对其进行修复。
awk '-F|' 'NR == 1 { next; }
{ gsub ("\042", "", $3); T3 += $3; }
{ gsub ("\042", "", $4); T4 += $4; }
END { printf ("T3 %.2f T4 %.2f\n", T3, T4); }'
如果这是一个示例,并且您计划对更多列执行此操作,我可能会将 T 放入数组中,并将其添加到函数中:
awk '-F|' 'NR == 1 { next; }
function Sum (f) {
gsub ("\042", "", $(f)); T[f] += $(f);
}
{ Sum(2); Sum(3); Sum(5); Sum(11); }
END {
for (f = 1; f < 20; ++f)
if (f in T) printf ("T%d %.2f\n", f, T[f]);
}'