无法计算不同格式.csv文件数据的多列总和

无法计算不同格式.csv文件数据的多列总和

我有一个场景,我想计算列的总和

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]);
}'

相关内容