Kombinieren Sie zwei Pipe-Befehle zu einem einzigen Befehl

Kombinieren Sie zwei Pipe-Befehle zu einem einzigen Befehl

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_veldie 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 teeund 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 teees tut, aber esIstSchneller.

verwandte Informationen