如何在linux中逐一完成各行的总和?

时间:2011-11-22 14:27:45

标签: awk

如何在Linux中的各行中进行总结?

我有一个文件:

Course Name: Math
Credit: 4
12345 1 4 5 1 1 1 1 1 5 10 1 2 2 20
34567 2 3 4 1 10 5 3 2 5 5 10 20 5
Course Name: English
Credit: 4
12345 1 4 5 1 1 1 1 1 5 10 1 20
34567 4 1 10 5 3 2 5 5 10 20 5

它的输出将来:

Course Name: Math
Credit: 4
12345     55
34567     75
Course Name: English
Credit: 4
12345     51
34567     70

我试过这段代码:

awk '{for (i=2; i<=NF; i++) {tot += $1}; print $1 "\t" tot; tot =0}' file > file2

输出如下:

Course Name: 0
Credit: 4
12345     55
34567     75
Course Name: 0
Credit: 4
12345     51
34567     70

实际上我也需要显示课程名称(数学和英语)。我试图解决它,但我不能。你能帮忙吗?

3 个答案:

答案 0 :(得分:2)

尝试:

awk '/^[0-9]/{for (i=2; i<=NF; i++) {tot += $i}; print $1 "\t" tot; tot =0} !/^[0-9]/' 

这只会对以数字开头的行进行求和,而只是打印那些没有数字的行。

答案 1 :(得分:0)

只是使用shell

while read line; do
  case $line in   
    Course*|Credit*) echo "$line" ;;
    *) set -- $line
       id=$1
       shift 1
       sum=$(IFS=+; echo "$*" | bc)
       printf "%s\t%d\n" $id $sum
       ;;
  esac
done  < filename

答案 2 :(得分:0)

这也可能对你有用!

sed '/:/{s/.*/echo "&"/;b};s/ /+/2g;s/\(\S*\) \(.*\)/echo "\1\t\$((\2))"/' file | sh