多个变量的列总和
Sum of Columns for multiple variables
使用 Shell 脚本 (Bash),我试图对列表中所有不同变量的列求和。假设我有以下输入 Test.tsv file
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
但是我需要为每个参与者重复这句话。当您需要对许多变量进行汇总时,这会变得很痛苦。
这个脚本应该怎么写?
谢谢!
这对于 awk 来说非常简单。使用 GNU awk:
awk -F '\t' 'BEGIN { OFS = FS } NR > 1 { won[] += ; lost[] += } 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[] += # tally up totals
lost[] +=
}
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]
}
使用 Shell 脚本 (Bash),我试图对列表中所有不同变量的列求和。假设我有以下输入 Test.tsv file
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
但是我需要为每个参与者重复这句话。当您需要对许多变量进行汇总时,这会变得很痛苦。
这个脚本应该怎么写?
谢谢!
这对于 awk 来说非常简单。使用 GNU awk:
awk -F '\t' 'BEGIN { OFS = FS } NR > 1 { won[] += ; lost[] += } 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[] += # tally up totals
lost[] +=
}
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]
}