Linux 使用AWK将列中的格式HH:MM:SS转换为秒

Linux 使用AWK将列中的格式HH:MM:SS转换为秒,linux,unix,awk,Linux,Unix,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###8

我有一张桌子

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="###"}

但是如何在同一脚本中通过“:”分隔字段并将其转换为秒?

您可以使用
split
功能:

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

awk'{split($0,a,“:”);print(a[1]*86400)+(a[2]*3600)+(a[3]*60)+a[4]}我提出这个解决方案

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
awk'开始{
FS=OFS=“####”;
拆分(“160360086400”,vconv“”);
}
{
n=拆分($4,vtime,“:”)
秒=0;

对于(i=1;i,如果将其放入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

另一个
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

@JoseRicardoBustosM.你是对的,但重点是要表明他可以使用拆分函数。我将删除错误的部分以避免混淆。很好,谢谢,伙计,这是工作,但如果我有像这样的空字段,RMA#####Order########00:56:10###################AK234,这是工作吗如果你找到一个足够的,请接受它。
$ 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
[root@test /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