Eu tenho um arquivo no seguinte formato e é separado por tabulações
a k testis adult male 8 week rRNA
b k testis adult male 8 week rRNA
c k testis adult male 8 week rRNA
Eu quero fazer alguma operação em cada linha, então estou usando um loop while. Quero dividir cada linha na guia e armazenar, digamos, a 6ª coluna que está 8 week
em uma variável. Estou usando este código, mas não consigo obter o que quero
while read -r line; do tmp=(${line///}); col6=${tmp[5]}; echo "$col6"; done < file.txt
Isso me dá 8
e não 8 week
. 8 semanas tem um espaço entre 8 e semana e, portanto, quero dividir a linha na guia.
A atribuição de matriz
tmp=(${line///})
divide o valor em qualquer caractere queIFS
contenha, o que por padrão inclui tabulações, espaços e novas linhas. (Não vejo o que a substituição vazia faz.) Para dividir apenas nas guias, definaIFS
assim:Embora isso ainda deixe o globbing como um problema e, como você já está usando
while read
, você pode usarread -a tmp
(somente no Bash, substitua-a
por-A
ksh/zsh/yash), ele divide a linha de entrada com base emIFS
e armazena os campos resultantes como elementos de a matriz nomeada:Isso imprime
8 week
. A outra vantagem disso é que a alteraçãoIFS
só tem efeito durante oread
, não para o restante do script.Cuidado, no entanto, que
read
remove os campos vazios ao usar a tabulação como delimitador. Emzsh
, você pode substituirIFS=$'\t'
porIFS=$'\t\t'
para impedir que isso aconteça.Claro, se soubermos o número/significado dos campos, poderíamos apenas
read
dividi-los para separar as variáveis nomeadas:Ou, se você quiser imprimir apenas uma coluna, use
cut
:Se você tiver colunas vazias
cut -d$'\t'
eIFS=$'\t'
tiver um comportamento diferente em relação a elas. Cut tratará cada tabulação individual como um separador distinto, enquantoread
usará tabulações consecutivas como apenas um único separador. Ou seja, a stringfoo<tab><tab>bar
será lida como apenas duas colunas porread
, mas três colunas porcut
.Você não pode alterar isso para tabulações, mas os caracteres de impressão são sempre reconhecidos como separadores distintos, portanto, você pode alterar as tabulações para algum caractere que não apareça nos dados e usá-lo como separador, por exemplo
... | tr '\t' : | IFS=: read -r -a tmp
.