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 tee
e 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 tee
faz, masémais rápido.