如何使用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)
包含最后一列的值。 c
和 s
是关联数组。 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 更改时及时打印出统计信息 - 请注意,这需要按
排序
我有一个原始数据文件,我想生成一个输出文件,这两个文件如下所示。生成规则是输出中的第 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)
包含最后一列的值。 c
和 s
是关联数组。 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 更改时及时打印出统计信息 - 请注意,这需要按