2011-11-22 51 views
1

如何在Linux中進行個別行的和?如何在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

我想和你在[this chap](http://stackoverflow.com/users/1050667/user1050667)在同一個班上? –

+0

大聲笑!!!!!!!!!!!! +1 –

回答

2

嘗試:

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

這隻會總結以數字開頭的行,並簡單地打印那些沒有。

+0

這應該是'tot + = $ i' ..好的答案。 –

+1

@Shawn謝謝,修正。永遠不要盲目地複製問題中給出的代碼! –

+0

感謝dude.Its正在工作 – user1059932

0

只是外殼

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 
0

這可能會爲你工作了!

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