Eu não acho que isso será possível usando ferramentas simples como cut
. Ou, pelo menos, não facilmente. Aqui está uma solução Perl:
$ perl -lane '$k=join " ",grep{/hello/}@F; print "$F[1] $k" if $k' file
ID23 hello1
ID47 hello2
ID49 hello3 hello4
Que você poderia simplificar usando grep
primeiro:
$ grep hello file | perl -lane 'print "$F[1] ", join(" ", grep{/hello/}@F)'
ID23 hello1
ID47 hello2
ID49 hello3 hello4
Explicação
A opção -n
informa perl
para ler sua entrada linha por linha e aplicar o script fornecido por -e
. O sinalizador -l
adiciona uma nova linha ( \n
) a cada print
chamada. A opção -a
faz com que perl
divida suas linhas de entrada no espaço em branco na matriz @F
.
Portanto, o próprio script está procurando todos os elementos de @F
(todas as colunas) que correspondem a hello
e salvando-os como a string separada por espaço $k
( $k=join " ",grep{/hello/}@F;
). Em seguida, o segundo campo ( $F[1]
) e $k
serão impressos se $k
for definido, se pelo menos um hello
for encontrado.
A segunda versão é a mesma, exceto que não precisamos de $k
e imprimir diretamente, pois sabemos que pelo menos um hello
estará sempre presente.