Se bem entendi, você quer que a quinta coluna se torne a concatenação com espaço de todos os números de 6 dígitos.
Talvez:
perl -F'\t' -lape '
$F[4] = join " ", grep {length == 6} ($F[4] =~ /\d+/g);
$_ = join "\t", @F' < file
Ou reutilize seu olhar negativo em torno dos operadores:
perl -F'\t' -lape '
$F[4] = join " ", ($F[4] =~ /(?<!\d)\d{6}(?!\d)/g);
$_ = join "\t", @F' < file
com awk
:
awk -F'\t' -v OFS='\t' '
{
repl = sep = ""
while (match($5, /[0-9]+/)) {
if (RLENGTH == 6) {
repl = repl sep substr($5, RSTART, RLENGTH)
sep = " "
}
$5 = substr($5, RSTART+RLENGTH)
}
$5 = repl
print
}' < file
grep
em si não é muito adequado para a tarefa. grep
destina-se a imprimir as linhas que correspondem a um padrão. Algumas implementações como GNU ou ast-open grep
, ou pcregrep
podem extrair strings das linhas correspondentes, mas isso é bastante limitado.
A única abordagem cut
+ grep
+ paste
que posso pensar que poderia funcionar com algumas restrições seria com a implementação pcregrep
grep
:
n='(?:.*?((?1)))?'
paste <(< file cut -f1-4) <(< file cut -f5 |
pcregrep --om-separator=" " -o1 -o2 -o3 -o4 -o5 -o6 -o7 -o8 -o9 \
"((?<!\d)\d{6}(?!\d))$n$n$n$n$n$n$n$n"
) <(< file cut -f6-)
Isso pressupõe que cada linha de entrada tenha pelo menos 6 campos e que o 5º campo de cada um tenha entre 1 e 9 números de 6 dígitos.