使用Awk将时间戳数据从每秒钟转换为每分钟的更好方法
问题描述:
我试图从每秒钟到每分钟(以当天所有数值的平均值为单位)汇总数据。我的数据的时间戳的形式为:使用Awk将时间戳数据从每秒钟转换为每分钟的更好方法
date time[h:m:s-03:00],X,value
2016-05-29 15:50:33-03:00,X,561
2016-05-29 15:50:34-03:00,X,565
....
我已经破解我的方式与下面的代码的答案,但我想找到一个更好的,更清洁的方式做到这一点:
awk -F: 'BEGIN{
foo_total=0;
foo=0; }
{
split($4,ar,",");
foo=ar[3];
split($3,a,"-");
if(a[1]~"00"){
first_foo=ar[3]}
if(a[1]!~"00"){
foo_total+=ar[3]}
foo_sum=(first_foo + foo_total);
foo_final=foo_sum/60
if(a[1]~"59") {printf $1":"$2","foo_final"\n"; foo_total=0; first_foo=0;} }' MyFile.csv
非常感谢您的帮助!
答
请看看下面的awk
代码:
BEGIN { total = 0; DayHour="Empty"; Min="";}
{
if((DayHour ~ $1) && (Min ~ $2))
{
split($4,a,",");
total += a[3];
}
else
{
if(DayHour !~ "Empty")
print DayHour":"Min, total/60;
DayHour=$1;
Min=$2;
split($4,a,",");
total = a[3];
}
}
END {print DayHour":"Min, total/60; }
你运行它基于awk -F: -f progam <data_file>
答
perl的方法:
$ cat testdata
2016-05-29 15:50:33-03:00,X,561
2016-05-29 15:50:34-03:00,X,565
$ perl -E 'my %arr; my %len;
while(<STDIN>){
m/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}):\d{2}-03:00,X,([0-9]*)/;
$arr{$1} += $2; $len{$1}++;
}
foreach my $key (sort keys %arr) {
print "$key-03:00,X,". ($arr{$key}/$len{$key}) . "\n";
}' < testdata
2016-05-29 15:50-03:00,X,563
说明:
- 对于每个立ne,分割行(m/... line)&
- 累计值&哈希长度分别命名为arr & len。
- 最后打印出平均值。
您可以跳过逻辑的长度部分&将其硬编码为60.但是IMO记录每分钟的实际数量是安全的。
请指定样本输入和预期输出以及相同的说明。 – piyushj
另一方面,你不应该在没有格式字符串的情况下使用'printf'(用任何编程语言,awk,c,bash等)。 'printf stringvariable'可以正确写成'printf'%s“,stringvariable' – anishsane