объединить вывод команды с последним полем другого - PullRequest
1 голос
/ 18 марта 2020

список 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

Мне нужно только поле uptime во 2-й команде o / p ..
Может мне помочь с этим, пожалуйста

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Предполагая, что эти выходы разделены табуляцией:

paste <(xen list) <(xen uptime | awk -F'\t' '{print $NF}')
1 голос
/ 18 марта 2020

Не могли бы вы попробовать следующее. Написано и протестировано с показанными образцами.

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, если кто-то хочет не хотеть печатать значения State и Time, попробуйте выполнить следующее.

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)
...