【问题标题】:adding columns for specified rows & dividing by the number of rows using awk为指定行添加列并使用 awk 除以行数
【发布时间】:2016-02-15 10:00:16
【问题描述】:

所以我对使用 linux 和脚本命令非常陌生,非常感谢您的帮助! 我有一个 1050 行 8 列的文件。示例:

anger 1 0 5 101 13 2 somesentenceofwords
anger 2 0 5 101 23 3 somesentenceofwords
anger 3 0 3 101 35 3 somesentenceofwords
anger 4 0 2 101 23 3 somesentenceofwords
arch 5 0 3 101 34 12 somesentenceofwords
arch 6 0 2 101 45 23 somesentenceofwords
arch 7 0 2 101 23 12 somesentenceofwords
hand 8 9 0 101 32 21 somesentenceofwords
hand 9 0 2 101 23 12 somesentenceofwords

我想要做的是,如果第一列对于 x 行数相同,则输出这些行的第 6 列的总和,然后将其除以行数(基本上是平均值)。

因此,在示例中,由于前 4 行都是愤怒的,我想在第 1 列的第 6 列中获得与愤怒的所有行相对应的数字的平均值。它将增加 13 + 23 + 35 + 23 / 4。然后它会为拱门做同样的事情,然后是手等等。

示例输出:

anger 23.5 arch 34 hand 27.5

我尝试这样做只是为了看看我是否可以单独执行此操作,其中每列都等于一个特定的字母字符串,但甚至无法使其正常工作。

$ awk '{if($1="anger"){sum+=$6} {print sum}}' filename

这可能吗?

【问题讨论】:

    标签: shell awk


    【解决方案1】:

    使用awk

    awk '!($1 in s){b[++i]=$1; s[$1]=0} {c[$1]++; s[$1]+=$6} 
            END{for (k=1; k<=i; k++) printf "%s %.1f\n", b[k], s[b[k]]/c[b[k]]}' file
    anger 23.5
    arch 34.0
    hand 27.5
    

    【讨论】:

    • 那么额外映射的原因是能够以预先确定的顺序遍历记录?还是有其他原因?
    • 额外映射的唯一原因是为了保留文件中记录的原始顺序。
    • 谢谢!工作得很好,是的,user000001 的脚本提供了相同的输出,但顺序不同。
    【解决方案2】:

    使用 awk 非常简单:

    $ awk '{a[$1]+=$6;b[$1]++}END{for (i in a) print i,a[i]/b[i]}' file
    hand 27.5
    arch 34
    anger 23.5
    

    这是如何工作的?

    {a[$1]+=$6;b[$1]++} 对读取的每一行执行。我们创建了两个映射,一个存储每个键的总和,另一个存储每个键的计数。

    END{for (i in a) print i,a[i]/b[i]} 在读取所有行后执行。我们遍历第一个映射的键,并打印键,以及总和除以计数(即均值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多