Linux命令(计算求和)



我有一个.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[$1] += $2} END {for (i in sums) print i, sums[i]}' file | sort -rnk2
c 19
a 18
b 9

sums[$1] += $2是由字段#1 ($1)索引的数组sums$2的相加值。

sort -rnk2awk在字段2上的反向排序数值输出

使用可以使用以下代码:

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的反向数字排序

非awk解决方案

perl

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

bash version 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

最新更新