2016-03-23 6 views
0

Ich benutze awk, um eine Datei zu teilen, wo ich drei durch Leerzeichen getrennte Splits habe: 1. Startpunkt; 2. Endpunkt; 3. EtikettLabel Timestamps nach Intervallen in Bash

Ich möchte neue Etiketten innerhalb definierter Rahmen erstellen, die ein if erfordert, wo ich ein wenig feststecke.

Ich suche etwas wie folgt aus:

num_intervals == (tail -1 | ending point)/250000 
count == 1 
interval == 2500000 
current_interval_start == 0 
current_interval_end == current_interval_start + interval 
for interval in num_intervals 
    if starting_point >= current_interval_start and if ending_point <= current_interval_end then 
     print count + label 
     count == count + 1 
     current_interval_start == current_interval_end 
     current_interval_end == current_interval_start + interval 

* Beobachtung, wenn zwei Etiketten im gleichen Intervallbereich sind, nehmen Sie die erste, aber ich könnte diesen Prozess stellen.

Meine Daten sieht wie folgt aus:

0 2300000 null 
2300000 4300000 h 
4300000 8000000 aa 
8000000 11500000 t 
11500000 28400001 null 

Was ich als Ausgabe das wäre möchte:

0 2500000 null 
2500000 5000000 h 
5000000 7500000 aa 
7500000 1000000 aa 
1000000 1250000 t 
1250000 1500000 null 
1500000 1750000 null 
1750000 2000000 null 
2000000 2250000 null 
2500000 2750000 null 
2750000 3000000 null 
+0

Sie wollen um alle aktuellen Zahlen bis zur nächsten Zahl, die durch 2500000 teilbar ist, zu runden und dann jeden Bereich in Einheiten dieser Größe aufzuteilen? –

Antwort

1

Sie mit nur awk tun können:

awk -v s=2500000 '{ 
    f=int($1/s); 
    l=int($2/s); 
    if((l-f) > 0){ 
     for(i=f+1;i<=l;i++){ 
       a[i]=$3 
     } 
    } 
} 
END { 
    e=int($2/s); 
    for (i=0;i<=e;i++){ 
     if (i in a){ 
       print i*s,(i+1)*s,a[i] 
     } 
     else{ 
       print i*s,(i+1)*s,"null" 
     } 
    } 
}' 
+0

das ist steller! Ich habe ein bisschen damit gespielt, um genau zu verstehen, was es getan hat, aber genau das habe ich versucht! Vielen Dank! – badner