Объединение двух команд канала в одну команду

Используя новые образцы данных (, которые не содержат дубликатов ), попробуйте

awk -F: '$2 != "" {print $3}' file
671014
214828

8561535
123hacker
8109201
0611314

Что вы подразумеваете под «содержать строку»? Невозможно сделать вывод из вашего образца.

Если эта Refineryhotel2строка НЕ ​​является артефактом (, она единственная, содержащая всего два поля ), попробуйте

awk -F: '$3 == "" {print $2; next}; $2 != "" {print $3} ' file
671014
214828
Refineryhotel2
8561535
123hacker
8109201
0611314
-1
04.06.2021, 13:35
3 ответа
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-е поле первой строки после "linear" и 2-е поле строки, которая не содержит x или y (т.е. должно быть z )после "angular ".


Вот немного более простая версия того же скрипта. Установив разделитель полей на «один -или -больше пробельных символов, которым может предшествовать символ двоеточия» (с-F':?[[:space:]]+')и принимая во внимание, что это изменение повлияет на нумерацию полей, мы не нужно использоватьgsub():

rostopic echo /cmd_vel | 
  awk -F':?[[:space:]]+' '
      /angular/ { m = "z" ; next};
      /linear/  { m = "x" ; next};
      $2 && $2 == m { print $3 ; m = ""}'
1
28.07.2021, 11:27

С 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

1
28.07.2021, 11:27

Подобно другому отличному ответу , вы можете сделать это несколько «параллельно», но используя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, но работает быстрее.

0
28.07.2021, 11:27

Теги

Похожие вопросы