为指定的行添加列&除以使用awk的行数

时间:2014-07-16 17:13:51

标签: shell awk

所以我使用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行都是愤怒,我想得到对应于第6列第6列的所有行的数字的平均值。它会增加13 + 23 + 35 + 23/4。然后它将对拱形,然后手等同样做。

示例输出:

anger 23.5 arch 34 hand 27.5

我试过这只是为了看看我是否可以单独进行,每列都等于一个特定的字母字符串但是甚至无法使其工作。

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

这可能吗?

2 个答案:

答案 0 :(得分:1)

使用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]}。我们迭代第一张地图的键,然后打印密钥,并将总和除以计数(即均值)。

答案 1 :(得分: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