2016-07-29 86 views
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: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實現這一點?

謝謝!!!

回答

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 
+0

您也可以使用流程替換。我會像'grep -vf <(cut -d「」-f1 datafile)''和'sort -n <(echo -e「$ {remaining}」)datafile'這樣的類型寫'grep'。 你有另一種解決方案,沒有'grep'和'uniq'查看第一個字符: 'sort -r <(for 0 in 0 {0..9} {10..23}; do echo「$ date:$我0「;完成)datafile | uniq -w 15 |排序' –

+1

您可以通過'for {0..23}中的for使for for循環更容易;做printf「%s:%02d 0 \ n」$ date $ i; done','%02d'將在需要時添加一個零。 –

+1

谷歌UUOC,谷歌棄用反引號,並閱讀[爲什麼使用一個shell循環處理文本考慮糟糕的做法](http://unix.stackexchange.com/questions/169716/爲什麼要使用shell循環處理文本被認爲是不好的練習)來理解一些但不是全部的不這樣做的原因。 –

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 
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 
+0

謝謝你這麼多anubhava您的幫助,這項工作對我來說。你也可以請詳細解釋一下上面的命令在做什麼,那真的很感謝。特別是你的意思是什麼[:[:blank:]] +謝謝! – Vasu

+0

'[:blank:]'與空格或製表符匹配。 '[:[:blank:]] +'是匹配一個或多個冒號或空格或製表符的字符類,用於分割字段。我們正在這樣做,以便我們可以在'$ 2'中使用小時數。 – anubhava

+0

此外,如果它解決了,[您可以通過點擊本答案左上角的**勾號**標記答案](http://meta.stackexchange.com/a/5235/160242) – anubhava

相關問題