將兩個管道命令合併為一個命令

將兩個管道命令合併為一個命令

我有這兩個程式碼,我想將它們合併/組合成一個:

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,但它快點。

相關內容