2016-07-29 15 views
0

ich Daten wie unten haben:Einfügen eines neuen Linien mit fehlenden Werten in einem Array

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 

In der obigen i Stunden von 00 bis bis 23 angezeigt werden soll, wie unten:

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 

konnte Bitte lass es mich wissen, wie kann ich das mit awk erreichen?

Danke !!!

Antwort

0

Dies nutzt mehr Werkzeuge als nur awk, aber es könnte hilfreich sein:

#!/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

Sie können auch die Prozesssubstitution verwenden. Ich hätte die 'grep' geschrieben wie' grep -vf <(cut -d "" -f1 Datendatei) ', und die Sortierung wie' sort -n <(echo -e "$ {restliche}") Datendatei. Sie haben eine andere Lösung ohne 'grep' mit' uniq' und schauen sich die ersten Zeichen an: 'sort -r <(für i in 0 {0..9} {10..23}; echo" $ date: $ i 0 "; done) Datendatei | uniq -w 15 | sort' –

+1

Sie können die for-Schleife einfacher machen mit 'for i in {0..23}; printf "% s:% 02d 0 \ n" $ Datum $ i; fertig, fügt das% 02d bei Bedarf eine Null hinzu. –

+1

google UUOC, google missbilligte Backticks, und lesen [warum-ist-mit-einer-Shell-Schleife-zu-Prozess-Text-betrachtet-schlecht-Praxis] (http://unix.stackexchange.com/questions/169716/ why-is-using-a-shell-loop-to-process-text-betrachtet-schlechte-praxis) um einige, aber nicht alle Gründe zu verstehen, dies nicht zu tun. –

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

Mit awk Sie dies tun können:

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

Vielen Dank anubhava für Ihre Hilfe, das funktioniert für mich. Könntest du mir bitte auch ausführlich erklären, was der obige Befehl macht, würde das wirklich zu schätzen wissen. vor allem, was meinst du mit [: [: blank:]] + Danke !! – Vasu

+0

'[: blank:] 'entspricht einem Leerzeichen oder einer Registerkarte. '[: [: blank:]] + + ist eine Zeichenklasse, die mindestens 1 Punkt oder ein Leerzeichen oder eine Registerkarte zum Teilen der Felder entspricht. Wir machen so, dass wir die Stunde in $ 2 eingeben können. – anubhava

+0

Auch wenn es geklappt hat, [Sie können die Antwort als akzeptiert markieren, indem Sie auf ** Häkchen ** oben links in dieser Antwort klicken] (http://meta.stackexchange.com/a/5235/160242) – anubhava

Verwandte Themen