【问题标题】:merge a command's output with another's last field将命令的输出与另一个命令的最后一个字段合并
【发布时间】:2020-03-18 07:41:15
【问题描述】:

xen 列表; xen uptime ,想将两个命令 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 sed xen


    【解决方案1】:

    请您尝试以下操作。使用所示示例编写和测试。

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

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

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


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

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

    【讨论】:

    • 太棒了..如果可能在 OP 中删除这两个字段 "State" ,"Time(s)",我可以这样做,但必须再次使用管道 '|' & awk $1...$6
    • @Prathiba,您能否尝试关注awk 'FNR==NR{if(FNR==1){a[$1]=$NF;next};match($0,/[0-9]+ days/);a[$1]=substr($0,RSTART,RLENGTH);next} {$NF=$(NF-1)="";sub(/ +$/,"");print $0,a[$1]}' &lt;(xen uptime) &lt;(xen list),让我知道这是否对您有帮助?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2013-11-08
      • 1970-01-01
      • 2019-06-23
      • 2019-06-13
      • 2015-08-18
      相关资源
      最近更新 更多