在数组中插入缺少值的新行

时间:2016-07-29 21:56:19

标签: shell awk

我有如下数据:

2016-07-25:06   5
2016-07-25:07   1
2016-07-25:08   1
2016-07-25:09   2
2016-07-25:10   1
2016-07-25:11   1
2016-07-25:13   9
2016-07-25:14   1

在上面我应该显示从00到23的小时,如下所示:

2016-07-25:00   0
2016-07-25:01   0
2016-07-25:02   0
2016-07-25:03   0
2016-07-25:04   0
2016-07-25:05   0
2016-07-25:06   5
2016-07-25:07   1
2016-07-25:08   1
2016-07-25:09   2
2016-07-25:10   1
2016-07-25:11   1
2016-07-25:12   0
2016-07-25:13   9
2016-07-25:14   1
2016-07-25:15   0
2016-07-25:16   0
2016-07-25:17   0
2016-07-25:18   0
2016-07-25:19   0
2016-07-25:20   0
2016-07-25:21   0
2016-07-25:22   0
2016-07-25:23   0
你可以告诉我如何用awk实现这个目标吗?

谢谢!!!

3 个答案:

答案 0 :(得分:0)

$ cat tst.awk
BEGIN { FS="[:[:space:]]+" }

function prt() {
    if ( NR > 1 ) {
        for (i=0; i<=23; i++) {
            printf "%s:%02d%s%d\n", $1, i, OFS, val[$1,i]
        }
        delete val
    }
}

$1 != prev { prt() }
{ val[$1,$2+0]=$3; prev=$1 }
END { prt() }

$ awk -f tst.awk file
2016-07-25:00 0
2016-07-25:01 0
2016-07-25:02 0
2016-07-25:03 0
2016-07-25:04 0
2016-07-25:05 0
2016-07-25:06 5
2016-07-25:07 1
2016-07-25:08 1
2016-07-25:09 2
2016-07-25:10 1
2016-07-25:11 1
2016-07-25:12 0
2016-07-25:13 9
2016-07-25:14 1
2016-07-25:15 0
2016-07-25:16 0
2016-07-25:17 0
2016-07-25:18 0
2016-07-25:19 0
2016-07-25:20 0
2016-07-25:21 0
2016-07-25:22 0
2016-07-25:23 0

答案 1 :(得分:0)

使用awk你可以这样做:

awk -F '[:[:blank:]]+' '{for (;i<$2; i++) printf "%s:%02d\t0\n", $1, i; print; i++; s=$1}
        END{for (;i<24; i++) printf "%s:%02d\t0\n", s, i}' file

2016-07-25:00   0
2016-07-25:01   0
2016-07-25:02   0
2016-07-25:03   0
2016-07-25:04   0
2016-07-25:05   0
2016-07-25:06   5
2016-07-25:07   1
2016-07-25:08   1
2016-07-25:09   2
2016-07-25:10   1
2016-07-25:11   1
2016-07-25:12   0
2016-07-25:13   9
2016-07-25:14   1
2016-07-25:15   0
2016-07-25:16   0
2016-07-25:17   0
2016-07-25:18   0
2016-07-25:19   0
2016-07-25:20   0
2016-07-25:21   0
2016-07-25:22   0
2016-07-25:23   0

答案 2 :(得分:0)

这比使用awk更多的工具,但它可能会有所帮助:

#!/bin/bash
date="2016-07-25" #or a method to get the date you are interested in

#Generate all the zero lines
remaining=`for i in 0{0..9} {10..23}; do echo "$date:$i   0"; done | grep -v "$(cat datafile | awk '{print $1}')"`

#Add the original data and sort the lines
echo -e "$remaining\n$(cat datafile)" | sort -n