【问题标题】:Linux command (Calculating the sum)Linux 命令(计算总和)
【发布时间】:2015-09-09 19:12:35
【问题描述】:

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

【问题讨论】:

  • 你是专门找一个命令,还是一个shell脚本就够了?
  • 你为什么不想要 awk?
  • Chris Beck:一个shell脚本就够了
  • (awk) jackman 没有问题。我在我的代码中使用了(awk)“太多”,我想知道是否还有其他方法可以做同样的事情

标签: linux shell command


【解决方案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$2 的值添加到由字段#1 ($1) 索引的数组sums 中。

sort -rnk2 是在字段 2 上对 awk 的数字输出进行反向排序

【讨论】:

  • 感谢 anaubhava 的回复。我想知道除了 (awk) 之外是否还有其他命令可以给出相同的结果。
  • 也可以在while read 循环中完成,但awk 有什么问题?
  • (awk) anubhava 绝对没有问题。我在我的代码中使用了(awk)“太多”,我想知道是否还有其他方法可以做同样的事情
  • 是的,正如我上面所说的,while read 循环也可以做到这一点,但awk 是最短和最干净的。
  • 感谢您的回复 anubhava。非常感谢
【解决方案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 进行反向数字排序

【讨论】:

  • 你是对的。但对我来说,使用 cat 作为第一个语句非常方便。例如,我需要操作数据。起初我需要知道cat access.log | tail -1 的文件格式是什么,然后我只想grep 这个小时的记录cat access.log | tail -1cat access.log | grep 09/Sep/2015:22 ,在我grep 所有有趣的记录之后,我在这个数据上运行 awk。是的,这是矫枉过正,但这样我只需要编辑字符串的结尾,而不是头部。
  • 感谢您的回复 BaZZiliO。非常感谢
【解决方案3】:

非 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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2014-09-16
      • 2012-01-25
      相关资源
      最近更新 更多