【问题标题】:Sum of Columns for multiple variables多个变量的列总和
【发布时间】:2015-04-16 13:56:47
【问题描述】:

使用 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

但是,我需要为每个参与者重复此行。当您有许多变量要总结时,这会变得很痛苦。

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

谢谢!

【问题讨论】:

    标签: bash shell sum multiple-columns


    【解决方案1】:

    这对于 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]
    }
    

    【讨论】:

    • 只使用 asort 不是更容易吗?
    • 您可以使用asorti,但由于这也是 GNU 特定的,因此没有太大区别。如果没有 GNU awk,我可能会将标头留在 awk 输出之外,打印未排序,通过sort 管道,然后添加标头。
    猜你喜欢
    • 2019-04-12
    • 2013-05-22
    • 1970-01-01
    • 2018-11-30
    • 2021-09-27
    相关资源
    最近更新 更多