将命令的输出与另一个命令的最后一个字段合并

merge a command's output with another's last field

xen列表; xen 正常运行时间,想要将两个命令 o/p 合并为单个..

hostname1-$ xen list; xen uptime 
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1917    24     r----- 6651158.5
aa                                         1  8192     4     -b---- 5826608.0
bb                                       9 12288     4     r----- 192566.9
Name                                ID Uptime 
Domain-0                             0 176 days, 10:54:22
aa                                  1 176 days, 10:15:33
bb                               9 5 days,  0:29:35

我尝试了多种方法来使用 awk、grep 和 sed 进行合并,但没有像预期的那样低于 o/p

Name                                        ID   Mem VCPUs      State   Time(s)  uptime
Domain-0                                     0  1917    24     r----- 6651158.5.  176 days,
aa                                         1  8192     4     -b---- 5826608.0.    176 days,
bb                                       9 12288     4     r----- 192566.9.       5 days

我只想要第二个命令中的正常运行时间字段o/p..
请帮我一下

能否请您尝试以下。使用显示的示例编写和测试。

awk 'FNR==NR{if(FNR==1){a[]=$NF;next};match([=10=],/[0-9]+ days/);a[]=substr([=10=],RSTART,RLENGTH);next} {print [=10=],a[]}' <(xen uptime) <(xen list)

或添加非单线性形式的解决方案:

awk '
FNR==NR{
  if(FNR==1){
    a[]=$NF
    next
  }
  match([=11=],/[0-9]+ days/)
  a[]=substr([=11=],RSTART,RLENGTH)
  next
}
{
  print [=11=],a[]
}' <(xen uptime) <(xen list)


编辑: 根据 OP,如果有人不想打印状态和时间值,请尝试以下操作。

awk '
FNR==NR{
  if(FNR==1){
    a[]=$NF
    next
  }
  match([=12=],/[0-9]+ days/)
  a[]=substr([=12=],RSTART,RLENGTH)
  next
}
{
  $NF=$(NF-1)=""
  sub(/ +$/,"")
  print [=12=],a[]
}' <(xen uptime) <(xen list)

假设这些输出是制表符分隔的:

paste <(xen list) <(xen uptime | awk -F'\t' '{print $NF}')