2015-06-19 53 views
1

荫的值来处理CSV文件:sum8的awk中和行基于三列

awk 'BEGIN {FS=OFS=";"} (NR==1) {$9="TpmC"; print $0} (NR>1 && NF) {a=$2$5; sum6[a]+=$6; sum7[a]+=$7; sum8[a]+=$8; other[a]=$0} END 
{for(i in sum7) {$0=other[i]; $6=sum6[i]; $7=sum7[i]; $8=sum8[i]; 
$9=(sum8[i]?sum8[i]/sum6[i]:"NaN"); print}}' input.csv > output.csv 

它做行的总和6,7,8列,然后除以/ sum6在第2列和第5列中具有相同值的行的全部内容。

我对此有两个问题
1)我需要相同的功能,但必须对列2,3中具有相同值的行进行所有计算和5.我试图更换

a=$2$5; 

b=$2$3; a=$b$5; 

但它给我错误的号码。

2)我怎么能删除与值的所有行:

Date;DBMS;Mode;Test type;W;time;TotalTPCC;NewOrder Tpm 

除了第一行?

这里是csv.input的一些示例:

Date;DBMS;Mode;Test type;W;time;TotalTPCC;NewOrder Tpm 
Tue Jun 16 21:08:33 CEST 2015;sqlite;in-memory;TPC-C test;1;10;83970;35975 
Tue Jun 16 21:18:43 CEST 2015;sqlite;in-memory;TPC-C test;1;10;83470;35790 
Date;DBMS;Mode;Test type;W;time;TotalTPCC;NewOrder Tpm 
Tue Jun 16 23:35:35 CEST 2015;hsql;in-memory;TPC-C test;1;10;337120;144526 
Tue Jun 16 23:45:44 CEST 2015;hsql;in-memory;TPC-C test;1;10;310230;133271 
Thu Jun 18 00:10:45 CEST 2015;derby;on-disk;TPC-C test;5;120;64720;27964 
Thu Jun 18 02:41:27 CEST 2015;sqlite;on-disk;TPC-C test;1;120;60030;25705 
Thu Jun 18 04:42:14 CEST 2015;hsql;on-disk;TPC-C test;1;120;360900;154828 

output.csv应该是

Date;DBMS;Mode;Test type;W;time;TotalTPCC;NewOrder Tpm;TpmC 
Tue Jun 16 21:08:33 CEST 2015;sqlite;in-memory;TPC-C test;1;20;167440;71765;3588.25 
Tue Jun 16 23:35:35 CEST 2015;hsql;in-memory;TPC-C test;1;20;647350;277797;13889.85 
Thu Jun 18 00:10:45 CEST 2015;derby;on-disk;TPC-C test;5;120;64720;27964;233.03 
Thu Jun 18 02:41:27 CEST 2015;sqlite;on-disk;TPC-C test;1;120;60030;25705;214.20 
Thu Jun 18 04:42:14 CEST 2015;hsql;on-disk;TPC-C test;1;120;360900;154828;1290.23 
+2

看到(的一些行)'input.csv'可以帮助我们... – boardrider

回答

1

要由组列2,3和5使用a=$2$3$5。要删除多余的标题行,加上匹配语句($1 !~ /^Date/)

所以整个awk脚本变为:

BEGIN { 
    FS=OFS=";" 
} 
(NR==1) {$9="TpmC"; print $0} 
(NR>1 && NF && ($1 !~ /^Date/)) { 
    a=$2$3$5; sum6[a]+=$6; sum7[a]+=$7; sum8[a]+=$8; other[a]=$0 
} 
END { 
    for(i in sum7) { 
    $0=other[i]; $6=sum6[i]; $7=sum7[i]; $8=sum8[i]; $9=(sum8[i]?sum8[i]/sum6[i]:"NaN"); print 
    } 
}