A atribuição da matriz tmp=(${line///})
divide o valor em qualquer caractere IFS
, que, por padrão, inclui guias, e espaços e novas linhas. (Não vejo o que a substituição vazia faz.) Para dividir apenas nas guias, defina IFS
para isso:
foo=$'a\tk\testis\tadult\tmale\t8 week\tRNA'
IFS=$'\t'
tmp=($foo)
echo "${tmp[5]}"
Embora isso ainda pareça um problema, e como você já usa while read
, você pode usar read -a tmp
(pelo menos no Bash), ele divide a linha de entrada com base em IFS
e separa os campos para elementos da matriz nomeada:
$ while IFS=$'\t' read -r -a tmp ; do
echo "${tmp[5]}"
done <<< $'a\tk\testis\tadult\tmale\t8 week\tRNA'
Isso imprime 8 week
. A outra vantagem é que a mudança em IFS
só está em vigor pela duração do read
, não pelo resto do script.
É claro que, se soubermos o número / significado dos campos, poderemos ter apenas read
dividido para separar as variáveis nomeadas:
... IFS=$'\t' read -r col1 col2 col3 ...
Ou, se você quiser imprimir apenas essa coluna, use cut
:
cut -d$'\t' -f 6 < file.txt