多个变量的列总和

时间:2015-04-16 13:56:48

标签: bash shell sum multiple-columns

使用Shell脚本(Bash),我试图对列表中所有不同变量的列求和。假设我有一个Test.tsv文件的以下输入

           Win  Lost
Anna        1   1 
Charlotte   3   1
Lauren      5   5
Lauren      6   3
Charlotte   3   2
Charlotte   4   5
Charlotte   2   5
Anna        6   4
Charlotte   2   3
Lauren      3   6
Anna        1   2
Anna        6   2
Lauren      2   1
Lauren      5   5
Lauren      6   6
Charlotte   1   3
Anna        1   4

我想总结每个参与者赢了多少钱。所以我希望得到这个结果:

          Sum Win    Sum Lost
Anna        57         58
Charlotte   56         57
Lauren      53         56

我通常会做的是每人和每列的总和,并一遍又一遍地重复这个过程。请参阅下文,我将如何处理上述示例:

cat Test.tsv | grep -Pi '\bAnna\b' | cut -f2 -d$'\t' |paste -sd+ | bc > Output.tsv
cat Test.tsv | grep -Pi '\bCharlotte\b' | cut -f2 -d$'\t' |paste -sd+ | bc >> Output.tsv
cat Test.tsv | grep -Pi '\bLauren\b' | cut -f2 -d$'\t' |paste -sd+ | bc >> Output.tsv
cat Test.tsv | grep -Pi '\bAnna\b' | cut -f3 -d$'\t' |paste -sd+ | bc > Output.tsv
cat Test.tsv | grep -Pi '\bCharlotte\b' | cut -f3 -d$'\t' |paste -sd+ | bc >> Output.tsv
cat Test.tsv | grep -Pi '\bLauren\b' | cut -f3 -d$'\t' |paste -sd+ | bc >> Output.tsv

但是我需要为每个参与者重复这一行。当你需要很多变量时,这就变得很痛苦。

编写此脚本的方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:6)

使用awk这非常简单。使用GNU awk:

 awk -F '\t' 'BEGIN { OFS = FS } NR > 1 { won[$1] += $2; lost[$1] += $3 } END { PROCINFO["sorted_in"] = "@ind_str_asc"; print "", "Sum Win", "Sum Lost"; for(p in won) print p, won[p], lost[p] }' filename

-F '\t'在标签处生成awk分割线,然后:

BEGIN { OFS = FS }  # the output should be separated the same way as the input

NR > 1 {            # From the second line forward (skip header)
  won[$1] += $2     # tally up totals
  lost[$1] += $3
}

END {               # When done, print the lot.

  # GNU-specific: Sorted traversal or player names
  PROCINFO["sorted_in"] = "@ind_str_asc"

  print "", "Sum Win", "Sum Lost"
  for(p in won) print p, won[p], lost[p]
}