Linux

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

  • June 6, 2021

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

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

怎麼做?

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 echorostopic 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”之後第一行的第二個欄位,以及“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 = ""}'

引用自:https://unix.stackexchange.com/questions/652748