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