Я не думаю, что это будет возможно с помощью простых инструментов вроде cut
. Или, по крайней мере, нелегко. Вот решение Perl:
$ perl -lane '$k=join " ",grep{/hello/}@F; print "$F[1] $k" if $k' file
ID23 hello1
ID47 hello2
ID49 hello3 hello4
которое вы могли бы упростить, используя сначала grep
:
$ grep hello file | perl -lane 'print "$F[1] ", join(" ", grep{/hello/}@F)'
ID23 hello1
ID47 hello2
ID49 hello3 hello4
Параметр -n
указывает perl
читать его построчно ввести и применить скрипт, заданный как -e
. Флаг -l
добавляет новую строку ( \ n
) к каждому вызову print
. Параметр -a
заставляет perl
разбивать свои входные строки по пробелам в массив @F
.
Итак, сам скрипт ищет все элементы @F
(все столбцы), соответствующие hello
, и сохраняет их как строку, разделенную пробелами $ k
( $ k = join "", grep {/ hello /} @ F;
). Затем печатаются 2-е поле ( $ F [1]
) и $ k
, если определено $ k
, если хотя бы одно hello
.
Вторая версия такая же, за исключением того, что нам не нужно $ k
и печатать напрямую, поскольку мы знаем, что всегда будет присутствовать хотя бы одно hello
.