我有这两个代码,我想将它们合并/组合成一个:
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
与中描述的相同使用 rostopic echo,例如:
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
即“线性”之后第一行的第二个字段,以及该行的第二个字段不“角度”后包含 x 或 y(即必须是 z)。
这是同一脚本的稍微简单的版本。通过将字段分隔符设置为“一个或多个空白字符,可选地前面带有冒号字符”(带有-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
,但它是快点。