Linux 命令(计算总和)

Linux command (Calculating the sum)

我有一个包含以下内容的 .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 

您可以使用 awk 管道传输到 sort:

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

sums[] += </code> 的值添加到由字段 #1 (<code>) 索引的数组 sums 中。

sort -rnk2 是字段 2

awk 的反向排序数字输出

用户可以使用这个代码:

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

说明: cat 1.txt - 读取 1.txt 内容为

的文件

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

{arr[]+=} 为内容文件中的每一行增加数组项,第一个字段为键,第二个字段为值。字段分隔符默认为 space.

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

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

非 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

已接受非 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