2017-05-12 6 views
0

Ich möchte die folgenden Tab-getrennte Eingabe nehmen und überarbeiten die Tage in der Zeitdauer in den Feldern 4 und 5 zu einem Excel freundliche Zeitdauer, entweder HH: MM: SS oder idealerweise Sekunden. Diese Felder messen die Betriebszeit, die sich von 00:00:00 bis zu Hunderten von Tagen erstrecken kann.
Input:konvertieren "Tage hh: mm: ss" Feld zu hh: mm: ss oder Sekunden mit sed oder awk

<ip-address> field(2/2) field:(3:3) 2 days 18:18:27 23:23:57   n kB n GB 
<ip-address> field(2/2) field:(3:3) 18:18:27   23:23:57   n kB n GB 
<ip-address> field(2/2) field:(3:3) 18:18:27   2 days 23:23:57 n kB n GB 
<ip-address> field(2/2) field:(3:3) 2 days 18:18:27 21 days 23:23:57 n kB n GB 

gewünschte Ausgabe für den ersten Datensatz entweder von:

<ip-address> field(2/2) field:(3:3) 66:18:27   23:23:57   n kB n GB 
<ip-address> field(2/2) field:(3:3) 2387027   84237    n kB n GB 

wenn die Datei Register dort begrenzt sind sieben Felder; Wenn es durch Tabulator, Leerzeichen und: getrennt wird, ist es eher wie 30. Die Felder 2 und 3 sind länger, haben aber die gleiche Komplexität wie gezeigt.

Arbeiten mit sed ich einen Ausdruck erstellen kann, aber nicht wissen, wie es an Ort und Stelle zu bewerten:

sed "s/\([0-9]\+\) days \([0-9]\+\)/\1*24+\2/g" file 
<ip-address> field(2/2) field:(3:3) 2*24+18:18:27  23:23:57 n kB n GB 

Ich weiß, sed hat eine Methode bewerten, aber es passiert den ganzen Musterraum zurück in die Schale

sed "s/\([0-9]\+\) days \([0-9]\+\)/\1*24+\2/e" file 
<ip-address> is not recognised as an internal or external command yada yada 

Ich weiß, wie man Felder in einem awk Ausdruck hrs = $2 * 24 + $3 verwendet, aber in diesem Fall muss das Feld zuerst geteilt werden. Es ist nicht wert, die Linie in 30 Felder aufzuteilen.

Gibt es eine Möglichkeit, ein Feld in awk aufzuteilen und dann einen Ausdruck auf den Komponenten auszuwerten, oder den Ausdruck oben in sed auszuwerten, oder sonst?

Verwenden von Gnu sed und awk auf Win7. Derzeit würde kein BC lieber vermeiden, es sei denn, es ist überzeugend.

Bearbeiten: Clarified Tage ist optional in beiden Feldern.

Antwort

2

awk zur Rettung!

awk 'BEGIN {FS=OFS="\t"} 
      {split($4,d," days "); 
      split(d[2],t,":"); 
      h=d[1]*24+t[1]; 
      $4=h":"t[2]":"t[3]; 
      print; 
      $4=(h*60+t[2])*60+t[3]}1' file 

<ip-address> field(2/2) field:(3:3) 66:18:27 23:23:57 n kB n GB 
<ip-address> field(2/2) field:(3:3) 238707 23:23:57 n kB n GB 
+0

Großartig. Ich habe meinen ursprünglichen Beitrag bearbeitet, um zu verdeutlichen, dass Tage in beiden Feldern vorhanden sein können und nur eine Ausgabezeile benötigen. Ich habe entdeckt (also muss ich nicht fragen), dass die nachfolgende 1 bewirkt, dass der zweite Ausdruck so einfach zu modifizieren ist. Was ist der beste Weg, um $ 4 und $ 5 auf diese Weise zu behandeln und die Abwesenheit von "Tagen" in beiden Feldern zu behandeln? Ich denke 'awk 'BEGIN {}/Tage/in $ 4 * {split ($ 4 ...}/Tage/in $ 5 * {split {$ 5 ...}'' (* irgendwie ...) – gloopy

+0

vielleicht erstellen eine Funktion ist besser in diesem Fall von zwei Feldern, die die gleiche Behandlung benötigen ... – karakfa

+0

Meine aktuelle Lösung ist: 'awk 'BEGIN {FS = OFS =" \ t "} $ 4 ~/Tag [s]?/{split ($ 4 , d, "Tag [s]?"); split (d [2], t, ":"); h = d [1] * 24 + t [1]; $ 4 = h ":" t [2] ":" t [3]} $ 5 ~/Tag [s]?/{split ($ 5 ...} 1 'Datei' - ergibt die Betriebszeit eines Tages 1 Tag xx: xx: xx. Die Regex macht die Konvertierung komplizierter zu Sekunden. Über eine Funktion nachdenken. Windows '\" 'entgeht aus Gründen der Klarheit innerhalb des Skripts. Danke! – gloopy

Verwandte Themen