У меня есть эти два кода, и я хочу объединить их в один:
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
как это сделать?
решение1
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
}
}'
Это предполагает, что вывод rostopic echo /cmd_vel
такой же, как описано вИспользование ростопического эха, например:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Вывод скрипта awk с такими входными данными будет следующим:
2.0
0.0
т.е. 2-е поле первой строки после «линейного», и 2-е поле строки, котораяне делаетсодержат x или y (т.е. должно быть z) после «angular».
Вот немного более простая версия того же скрипта. Установив разделитель полей на "один или несколько пробельных символов, которым может предшествовать двоеточие" (с -F':?[[:space:]]+'
) и принимая во внимание, что это изменение повлияет на нумерацию полей, нам не нужно использовать gsub()
:
rostopic echo /cmd_vel |
awk -F':?[[:space:]]+' '
/angular/ { m = "z" ; next};
/linear/ { m = "x" ; next};
$2 && $2 == m { print $3 ; m = ""}'
решение2
С tee
заменой выходного процесса:
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
решение3
Похожий наеще один отличный ответ, вы можете сделать это несколько «параллельно», но используя 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)
Он не принимает входные данные, переданные по каналу, как tee
это делает, но онявляетсяБыстрее.