我有一个原始数据文件,我想要生成一个输出文件,这两个文件都如下所示。生成规则是输出中的第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 我认为这个评论可以解决这个问题,但我不知道如何得到它。
发布于 2015-02-28 15:39:43
这里不能使用sed,因为它不支持数学操作。这是awk的工作
awk 'NR>1{c[$2]++;s[$2]+=$(NF)}END{for(i in c){print i,s[i]/c[i]}}' input.txt解释:
NR>1 { c[$2]++; s[$2+=($NF) }NR>1意味着在除第一行之外的所有行上执行以下块。$2是第二列的值。NF是每行字段的数目。$(NF)包含最后一列的值。c和s是assoc数组。c统计$2出现的次数,c在最后一列中存储数字值的总和--按$2分组。
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注意,如果使用assoc aray,则会对输出顺序产生影响。如果您关心输出顺序,可以使用以下命令:
awk 'NR>1 && $2!=n && c {print n,t/c;c=t=0} NR>1{n=$2;c++;t+=$(NF)}'此命令不使用assoc数组,它会在$2更改时及时打印出统计数据--注意这需要按$2排序
https://stackoverflow.com/questions/28783405
复制相似问题