Как сделать сумму в отдельной строке один за другим в Linux? - PullRequest
1 голос
/ 22 ноября 2011

Как сделать сумму в отдельной строке в 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

Iпопробовал этот код:

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 ]

2 голосов
/ 22 ноября 2011

Попробуйте:

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

При этом будут суммироваться только строки, начинающиеся с цифры, и просто выводятся строки, которые этого не делают.

0 голосов
/ 24 ноября 2011

Это может сработать и для вас!

sed '/:/{s/.*/echo "&"/;b};s/ /+/2g;s/\(\S*\) \(.*\)/echo "\1\t\$((\2))"/' file | sh
0 голосов
/ 22 ноября 2011

Просто с оболочкой

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...