Combine dos comandos de tubería en un solo comando

Combine dos comandos de tubería en un solo comando

Tengo estos dos códigos y quiero fusionarlos/combinarlos en uno solo:

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 hacer eso?

Respuesta1

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
           } 
         }'

Esto supone que la salida de rostopic echo /cmd_veles la misma que se describe enUsando eco rostopic, p.ej:

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

La salida del script awk con esa entrada sería:

2.0
0.0

es decir, el segundo campo de la primera línea después de "lineal", y el segundo campo de la línea quenocontener x o y (es decir, debe ser z) después de "angular".


Aquí hay una versión un poco más simple del mismo script. Al establecer el separador de campos en "uno o más caracteres de espacio en blanco precedidos opcionalmente por dos puntos" (con -F':?[[:space:]]+') y teniendo en cuenta que este cambio afectará la numeración de los campos, no necesitamos usar gsub():

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

Respuesta2

Con teey una sustitución del proceso de salida:

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

Respuesta3

Similar aotra gran respuesta, puedes hacerlo un poco en "paralelo" pero 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)

No acepta entradas canalizadas como teelo hace, peroesmás rápido.

información relacionada