이 두 코드가 있는데 이를 하나로 병합/결합하고 싶습니다.
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
즉, "선형" 다음의 첫 번째 행의 두 번째 필드와 행의 두 번째 필드아니요"Angle"에는 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
않지만예서둘러요.