Combine dois comandos de pipe em um único comando

Combine dois comandos de pipe em um único comando

Eu tenho esses dois códigos e quero mesclá-los/combiná-los em um único:

rostopic echo /cmd_vel | grep -A 3 angular | grep -v x | grep -v y | cut -d : -f 2

rostopic echo /cmd_vel | grep -A 1 linear | grep -v linear | cut -d : -f 2

Como fazer isso?

Responder1

rostopic echo /cmd_vel | awk -F: '
         /angular/ { m = "z" ; next};   # we want z from angular
         /linear/  { m = "x" ; next};   # and x from linear
         { 
           gsub(/ /,"",$1);    # strip spaces from $1

           if ($1 == m) {      
             gsub(/ /,"",$2);  # strip spaces from $2
             print $2;         
             m = ""            # reset m so it doesnt match anything
           } 
         }'

Isso pressupõe que a saída de rostopic echo /cmd_velé a mesma descrita emUsando eco rostopic, por exemplo:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

A saída do script awk com essa entrada seria:

2.0
0.0

ou seja, o 2º campo da primeira linha depois de "linear" e o 2º campo da linha quenãocontém x ou y (ou seja, deve ser z) depois de "angular".


Aqui está uma versão um pouco mais simples do mesmo script. Ao definir o separador de campos como "um ou mais caracteres de espaço em branco opcionalmente precedidos por dois pontos" (com -F':?[[:space:]]+') e levando em consideração que essa alteração afetará a numeração dos campos, não precisamos usar gsub():

rostopic echo /cmd_vel | 
  awk -F':?[[:space:]]+' '
      /angular/ { m = "z" ; next};
      /linear/  { m = "x" ; next};
      $2 && $2 == m { print $3 ; m = ""}'

Responder2

Com teee uma substituição do processo de saída:

rostopic echo /cmd_vel \
| tee >(grep -A 3 angular | grep -v x | grep -v y | cut -d : -f 2) \
| grep -A 1 linear | grep -v linear | cut -d : -f 2

Responder3

Igual aoutra ótima resposta, você pode fazer isso em "paralelo", mas usando paste:

paste <(rostopic echo /cmd_vel | grep -A 3 angular | grep -v x | grep -v y | cut -d : -f 2) <(rostopic echo /cmd_vel | grep -A 1 linear | grep -v linear | cut -d : -f 2)

Ele não aceita entrada canalizada como teefaz, masémais rápido.

informação relacionada