sed / perl one liner用于解析csv文件和计算平均值

时间:2017-08-03 13:01:33

标签: perl sed

我要求在Sed中使用一个衬垫,可以对具有以下数据的CSV文件进行原位编辑。我需要识别具有最低开始时间的唯一进程ID。并在此过程中找到流程的平均值。

以下数据示例,我需要输出为

9110089,12:59:00,计算(4.1916 + 38.5992 + 13.1219)/ 3,计算(6.702 + 50.619 + 8.49)/ 3
9199888,01:50:00,计算(3.7563 + 16.859)/ 2,计算(1.956 + 41.5076)/ 2


(注意:列之间输入的空格,仅用于说明)

数据

process    start    avg1   avg2
9110089, 14:59:00, 4.1916, 6.702
9110089, 12:59:00, 38.5992, 50.619
9110089, 19:50:00, 13.1219, 8.49
9199888, 10:50:00, 3.7563,  1.956
9199888, 01:50:00, 16.859,  41.5076
299889,  00:39:00, 14.947,  5.4813
299889,  00:39:00, 3.67,    3.17004

请给我一些指示,非常糟糕的一个衬垫。

1 个答案:

答案 0 :(得分:1)

使用 datamash + 排序 + 剪切管道的解决方案:

datamash -ft, -g 1 mean 3 mean 4 < <(tail -n +2 yourfile | sort -t, -k1,2) | cut -d, -f1,2,5,6

输出:

299889,00:39:00,9.3085,4.32567
9110089,12:59:00,18.637566666667,21.937
9199888,01:50:00,10.30765,21.7318

其他 gawk 方法:

awk -F, 'NR<8{ a[$1]["avg1"]+=$3; a[$1]["avg2"]+=$4; c[$1]++; if(!($1 in t)) t[$1]=$2 }
     END{ for(i in a) print i,t[i],a[i]["avg1"]/c[i],a[i]["avg2"]/c[i] }' OFS=',' \
     <(sort -t, -k1,2 yourfile)

输出:

299889,00:39:00,9.3085,4.32567
9110089,12:59:00,18.6376,21.937
9199888,01:50:00,10.3077,21.7318