これら2つのコードがありますが、これを1つにマージ/結合したいと思います。
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
つまり、「線形」の後の最初の行の2番目のフィールドと行の2番目のフィールドいいえ「Angle」にはxまたはyが含まれます(つまり、zでなければなりません)。
これは同じスクリプトの少し簡単なバージョンです。フィールド区切り文字を「オプションでコロン文字の前にある1つ以上の空白文字」(有効-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
んが、はい急いで。