Ich habe diese beiden Codes und möchte sie zu einem einzigen zusammenführen/kombinieren:
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
wie geht das?
Antwort1
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
}
}'
Dies setzt voraus, dass die Ausgabe rostopic echo /cmd_vel
die gleiche ist wie inVerwendung von rostopischem Echo, z.B:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Die Ausgabe des awk-Skripts mit dieser Eingabe wäre:
2.0
0.0
das 2. Halbbild der ersten Zeile nach "linear" und das 2. Halbbild der Zeile, dienichtenthalten x oder y (d. h. muss z sein) nach „angular“.
Hier ist eine etwas einfachere Version desselben Skripts. Indem wir den Feldtrenner auf „ein oder mehrere Leerzeichen, optional mit vorangestelltem Doppelpunkt“ (mit -F':?[[:space:]]+'
) setzen und berücksichtigen, dass diese Änderung die Nummerierung der Felder beeinflusst, müssen wir nicht verwenden gsub()
:
rostopic echo /cmd_vel |
awk -F':?[[:space:]]+' '
/angular/ { m = "z" ; next};
/linear/ { m = "x" ; next};
$2 && $2 == m { print $3 ; m = ""}'
Antwort2
Mit tee
und einer Ausgabeprozesssubstitution:
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
Antwort3
Ähnlich zunoch eine tolle Antwort, Sie können es gewissermaßen „parallel“ tun, aber mit 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)
Es akzeptiert keine Piped-Eingabe wie tee
es tut, aber esIstSchneller.