如何使用awk和sed对一个数据进行统计

How to use awk and sed to make statistics on a data

我有一个原始数据文件,我想生成一个输出文件,这两个文件如下所示。生成规则是输出中的第 1 列等同于原始文件的第 2 列。输出中的第 2 列是原始数据中最后一列值的平均值,其中的行是匹配的。例如输出中的value1为(25+24.3846+13.8972+1.33333+1)/5.

 #Raw data
 4 compiler-compiler  100000 99975  1  25
  4 compiler-compiler  100000 99683  13  24.3846
  4 compiler-compiler  100000 93649  457  13.8972
  4 compiler-compiler  100000 99764  177  1.33333
  4 compiler-compiler  100000 99999  1  1
  4 compiler-sunflow  100000 99999  1  1
  4 compiler-sunflow  100000 99674  11  29.6364
  4 compiler-sunflow  100000 93467  423  15.4444
  4 compiler-sunflow  100000 99694  159  1.92453
  4 compiler-sunflow  100000 99938  4  15.5
  4 compress  100000 99997  1  3
  4 compress  100000 99653  10  34.7
  4 compress  100000 93639  454  14.011
  4 compress  100000 99666  173  1.93064
  4 compress  100000 99978  4  5.5
  4 serial  100000 99998  1  2
  4 serial  100000 99932  6  11.3333
  4 serial  100000 93068  460  15.0696
  4 serial  100000 99264  206  3.57282
  4 serial  100000 99997  3  1
  4 sunflow  100000 99998  1  2
  4 sunflow  100000 99546  18  25.2222
  4 sunflow  100000 93387  481  13.7484
  4 sunflow  100000 99752  189  1.31217
  4 sunflow  100000 99974  4  6.5
  4 xml-transfomer  100000 99994  1  6
  4 xml-transfomer  100000 99964  3  12
  4 xml-transfomer  100000 93621  463  13.7775
  4 xml-transfomer  100000 99540  199  2.31156
  4 xml-transfomer  100000 99986  2  7
  4 xml-validation  100000 99996  1  4
  4 xml-validation  100000 99563  16  27.3125
  4 xml-validation  100000 93748  451  13.8625
  4 xml-validation  100000 99716  190  1.49474
  4 xml-validation  100000 99979  3  7

#Output data
compiler-compiler   value1
....
xml-transfomer      value2
xml-validation      value3 

我认为 awk & sed 的评论可以解决这个问题,但我不知道如何获得它。

sed 不能在这里使用,因为它不支持数学运算。这是 awk:

的工作
awk 'NR>1{c[]++;s[]+=$(NF)}END{for(i in c){print i,s[i]/c[i]}}' input.txt

解释:

NR>1 { c[]++; s[+=($NF) }

NR>1 表示以下块在除第一行之外的所有行上执行。 </code> 是第二列的值。 <code>NF 是每行的字段数。 $(NF) 包含最后一列的值。 cs 是关联数组。 c 计算 </code> 的出现次数,<code>c 存储最后一列中数值的总和 - 按 </code>.</p> 分组 <pre><code>END {for(i in c){print i,s[i]/c[i]}}

END 表示在处理完最后一行输入后将执行以下操作。 for 循环遍历 c 并输出 c.

中所有索引的名称和平均值

输出:

xml-validation 10.7339
compiler-compiler 13.123
serial 6.59514
sunflow 9.75655
xml-transfomer 8.21781
compiler-sunflow 12.7011
compress 11.8283

请注意,如果使用关联数组,您会影响输出顺序。如果您关心输出顺序,您可以使用以下命令:

awk 'NR>1 && !=n && c {print n,t/c;c=t=0} NR>1{n=;c++;t+=$(NF)}'

此命令不使用关联数组,它会在 $2 更改时及时打印出统计信息 - 请注意,这需要按

排序