我有一个.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 -rnk2
是awk
在字段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解决方案
perlperl -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