두 개의 파이프 명령을 단일 명령으로 결합

두 개의 파이프 명령을 단일 명령으로 결합

나는 두 개의 코드를 가지고 있으며 그것들을 하나의 코드로 병합/결합하고 싶습니다.

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

즉, "linear" 다음 첫 번째 줄의 두 번째 필드이고, "linear" 다음 줄의 두 번째 필드입니다.그렇지 않다"angular" 뒤에 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파이프 방식의 입력은 허용 되지 않지만~이다더 빠르게.

관련 정보