如何在bash上从另一个中减去一个csv值?

时间:2018-01-16 07:03:36

标签: bash csv

我有两个csv文件: cs1.csv

total, , 1,2,3,4,5

和cs2.csv:

total, , 1,1,1,1,1

所以我试图从cs1.csv中减去cs2.csv,我该怎么做? 我也应该将'total'和空白变量转换为数字吗?

我试图这样做:

paste c1.csv c2.csv | awk '{print $1 - $2 }' > result.csv

但结果变为0。

编辑:预期输出应为:

total, , 0,1,2,3,4

, , 0,1,2,3,4

左右......

基本上,前两个变量并不重要,只要我得到它后面的数字。

2 个答案:

答案 0 :(得分:2)

您可以使用awk

awk 'BEGIN{FS=OFS=","} NR==FNR{for (i=1; i<=NF; i++) a[i]=$i; next} 
{for (i=1; i<=NF; i++) if ($i+0==$i) $i-=a[i]} 1' {cs2,cs1}.csv

total, ,0,1,2,3,4

$i+0==$i检查列值是否为数字。

答案 1 :(得分:1)

如果它真的如你所示,如果你对一个简单的方法更开心,你可以直接bash来做:

IFS=, read _ _ x1 x2 x3 x4 x5 < cs1.csv            # read cs1.csv ignoring first two values and using comma as IFS (input field separator)
IFS=, read _ _ y1 y2 y3 y4 y5 < cs2.csv            # read cs2.csv ignoring first two values and using comma as IFS (input field separator)

echo $((x1-y1)),$((x2-y2)),$((x3-y3)),$((x4-y4)),$((x5-y5))

示例输出

0,1,2,3,4

我不想误导你,所以你应该知道bash不能轻易处理浮点数/实数(非整数),如果字段数这个方法不灵活变化 - 但如果你正在学习,那可能就足够了。

如果您想处理实数,可以将数学外包给bc,将最后一行替换为:

bc <<< "$x1 - $y1; $x2 - $y2; $x3 - $y3; $x4 - $y4; $x5 - $y5"