いくつかの数字が入った .csv ファイルがあり、元の .csv ファイルの対応する行の数字の合計を含む、同じ行数と 1 つの列を持つ新しいファイルを取得したいと考えています。
入力例(空白に注意してください。問題にならないことを願っています)
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