我有两个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
左右......
基本上,前两个变量并不重要,只要我得到它后面的数字。
答案 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"