Linux命令(计算总和)

时间:2015-09-09 19:12:35

标签: linux shell command

我有一个包含以下内容的.txt文件:

a  3 
a  4 
a  5 
a  6 
b  1 
b  3 
b  5 
c  9 
c  10 

我想知道是否有任何命令(如果可能没有awk)可以读取.txt文件并提供以下输出(按第二列排序):

c  19
a  18 
b  9 

4 个答案:

答案 0 :(得分:1)

您可以使用awk管道sort

awk '{sums[$1] += $2} END {for (i in sums) print i, sums[i]}' file | sort -rnk2
c 19
a 18
b 9

sums[$1] += $2在由字段#1($2)编制索引的数组sums中添加$1的值。

sort -rnk2在字段2上对awk的数字输出进行反向排序

答案 1 :(得分:0)

使用可以使用此代码:

cat 1.txt | awk '{arr[$1]+=$2}END{for (var in arr) print var," ",arr[var]}' | sort -rnk 2

说明: cat 1.txt - 阅读内容

的1.txt文件

awk - 是一种对数据操作非常有用的语言

对于内容文件中的每一行,

{arr[$1]+=$2}增加数组项,其中键第一个字段的值为第二个字段。默认情况下,字段分隔符为空格。

END{for (var in arr) print var," ",arr[var]}' - 继续所有行后,打印数组内容

sort -rnk 2 - 字段2上的反向数字排序

答案 2 :(得分:0)

非awk解决方案。

perl的

perl -lane '
    $sum{$F[0]} += $F[1]
} END {
    $, = "  "; 
    print $_, $sum{$_} for reverse sort {$sum{$a} <=> $sum{$b}} keys %sum
' file.txt

bash版本4

declare -A sum
while read key val; do (( sum[$key] += $val )); done < file.txt
for key in "${!sum[@]}"; do echo "$key  ${sum[$key]}"; done | sort -rn -k2

答案 3 :(得分:0)

接受非awk挑战

vars=$(cut -d" " -f1 nums | uniq); paste <(echo "$vars") <(cat <(sed -e 's/  /+=/' nums) <(echo "$vars" | sed 's/$/;/') | bc) | sort -k2,2nr
c       19
a       18
b       9