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