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.