用于每小时计算给定字段的Shell脚本

时间:2017-06-09 08:22:51

标签: bash shell unix awk

我有一个文件,我必须提取一些数据,然后计算每小时报告。下面是我必须使用的示例输入字段,并以csv格式获取最终报告计数。提取细节已经完成,但小时报告使其变得复杂。你能帮助我吗?

MO,0,20170608230457826
MT,0,20170608220423442
MO,408,20170608223453234
MO,0,20170608224345342
MT,2,20170608227654342

以下格式需要输出:

MO 0 - 1 - 08/06/2017 23:00
MO 0 - 1 - 08/06/2017 22:00
MT 0 - 1 - 08/06/2017 22:00
MO 408 - 1 - 08/06/2017 22:00
MT 2 - 1 - 08/06/2017 22:00

到目前为止我准备的剧本。

Shell脚本

            da=`date -d "-1 day" +%Y%m%d`
            for i in VOLTE*
            do
                for j in MO MT CF
                do
                cat $i | grep $j | awk -F"," '{print $2","$11","$20}' >> $j.tmp
                    for n in 0 2 408 480 -1001 500
                    do
                    cat $j.tmp | awk -v num="$n" -F"," '{if( $3 == num ) print $0}' >> "$j"_"$n".tmp
                    done
                done
            done

1 个答案:

答案 0 :(得分:0)

gawk 解决方案:

awk -F, '{ match($3, /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})/, a); 
           printf("%s %s - 1 - %02d/%02d/%4d %2d:00\n",$1,$2,a[3],a[2],a[1],a[4]) }' file

输出:

MO 0 - 1 - 08/06/2017 23:00
MT 0 - 1 - 08/06/2017 22:00
MO 408 - 1 - 08/06/2017 22:00
MO 0 - 1 - 08/06/2017 22:00
MT 2 - 1 - 08/06/2017 22:00
  • match($3, /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})/, a) - 匹配第3个字段中所需的 datetime 部分。数组a将填充每个捕获的组的值,以便a[1]包含值([0-9]{4})