2015-09-10 129 views
1

列我有一個表轉換格式HH:MM:SS,以秒與AWK

RMA###Order###FR2345###00:56:10###AK234 
FWA###working###FR1345###00:30:20###DE432 
HQP###cat1###FR6798###1:00:20:40###TI685 

我需要替換該字段DD:HH:MM:SS,以秒

RMA###Order###FR2345###3370###AK234 
FWA###working###FR1345###1820###DE432 
HQP###cat1###FR6798###87640###TI685 

的表是由 '###' 分開的,但該字段是由 ':'

我尤斯

echo "1:00:20:40" | awk -F: '{ print ($1 * 86400)+($2 * 3600) + ($3 * 60) + $4 }' 
87640 

轉換

和表

awk -F, 'BEGIN {FS=OFS="###"} 

,但由現場如何單獨分開「:」並轉換爲秒,在同一個腳本?

+0

我看到你是堆棧溢出的新手。有很多人回答你的問題,所以如果你找到一個足夠的人,請接受它。 – bkmoney

回答

0

可以使用split功能:

awk '{ split($0,a,":"); print (a[1]*86400)+(a[2]*3600)+(a[3]*60)+a[4] }' <<< '1:00:20:40' 
87640 

所以,你不惹FS

+0

@JoseRicardoBustosM。你是對的,但重點是要表明他可以使用分割功能。我會刪除錯誤的部分以避免混淆。 – Tiago

0

我提出這個解決方案,

awk 'BEGIN { 
    FS=OFS="###"; 
    split("1 60 3600 86400", vconv, " "); 
} 
{ 
    n=split($4,vtime,":") 
    seconds = 0; 
    for(i=1; i<=n; i++){ 
    seconds += vconv[i] * vtime[n-i+1]; 
    } 
    $4 = seconds; 
    print; 
}' input 

你:

 
RMA###Order###FR2345###3370###AK234 
FWA###working###FR1345###1820###DE432 
HQP###cat1###FR6798###87640###TI685 
1

如果你把這個變成a.awk

BEGIN { 
    OFS = FS = "###" 
} 
{ 
    b = split($4,a,":") 
    if (b == 4) { 
     print $1, $2, $3, (a[1] * 86400)+(a[2] * 3600) + (a[3] * 60) + a[4], $5 
    } else { 
     print $1, $2, $3, (a[1] *3600) + (a[2] * 60) + a[3], $5 
    } 
} 

然後運行

awk -f a.awk foo.txt 

您將獲得所需的輸出:

RMA###Order###FR2345###3370###AK234 
FWA###working###FR1345###1820###DE432 
HQP###cat1###FR6798###87640###TI685 
+0

不錯!易於閱讀。 +1 – zedfoxus

+1

不錯,謝謝你,多數民衆贊成在工作,但如果我有這樣的RMA空字段###訂單###### 00:56:10 ### AK234多數民衆贊成在工作?謝謝 – Robinson

+0

它仍然有效,因爲我們已經設置了FS = ###。 – bkmoney

0

另一awk

$ awk 'BEGIN{FS=OFS="###"} 
      {n=split($4,t,":"); 
      s=0; 
      if(n==4)s=24*t[1]; 
      s=((s+t[n-2])*60+t[n-1])*60+t[n]; $4=s}1' file 

RMA###Order###FR2345###3370###AK234 
FWA###working###FR1345###1820###DE432 
HQP###cat1###FR6798###87640###TI685 
0
[[email protected] /tmp]$ awk 'BEGIN {FS=OFS="###"}{s=split($4,t,":");$4=t[s]+t[s-1]*60+t[s-2]*3600+t[s-3]*86400}1' file.txt 

RMA###Order###FR2345###3370###AK234 
FWA###working###FR1345###1820###DE432 
HQP###cat1###FR6798###87640###TI685