Используя новые образцы данных (, которые не содержат дубликатов ), попробуйте
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
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 = ""}'
С 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
Подобно другому отличному ответу , вы можете сделать это несколько «параллельно», но используя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
, но работает быстрее.