对 csv 文件的所有行求和

对 csv 文件的所有行求和

我有一个 .csv 文件,里面有一些数字,我想获取一个具有相同行数和一列的新文件,其中包含原始 .csv 文件中相应行的数字总和。

输入示例(请注意空格,我希望这不会是个问题)

 2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 4,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 5,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 6,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0

预期输出

2
4
5
6
7

我的代码(不产生任何输出):

    file_out="output.txt"
    file_in="input.txt"
    cmd3="sum_file=\$(awk -F, '
    {
        sum = 0; 
        for (i=1; i<=NF; i++) {
            sum += \$i;
        }
        print sum;
    }
    ' ${file_in})"
    echo $cmd3
    eval $cmd3
    eval "echo ${sum_file} > ${file_out}"

您也可以提出不同于 awk 的工具,但我很高兴知道为什么我的代码不起作用,可能是因为空格(我不这么认为)。

答案1

您不需要任何临时值。只需执行awk并将输出重定向到文件即可。

file_out="output.txt"
file_in="input.txt"
awk -F, '
{
    sum = 0; 
    for (i=1; i<=NF; i++) {
        sum += \$i;
    }
    print sum;
}
' "${file_in}" > "${file_out}"

答案2

awk

awk -F, '{sum=0; for (i=1; i<=NF; i++) {sum+= $i} print sum}' input.txt > output.txt

perl

perl -F, -lane '$s=0; $s+=$_ for @F; print $s' input.txt > output.txt

相关内容