![對 csv 檔案的所有行求和](https://rvso.com/image/1552391/%E5%B0%8D%20csv%20%E6%AA%94%E6%A1%88%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C%E6%B1%82%E5%92%8C.png)
我有一個 .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