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_vel
es 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 tee
y 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 tee
lo hace, peroesmás rápido.