AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 410710
Accepted
user3138373
user3138373
Asked: 2017-12-14 10:02:09 +0800 CST2017-12-14 10:02:09 +0800 CST 2017-12-14 10:02:09 +0800 CST

dividindo uma linha em array no bash com tabulação como delimitador

  • 772

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 weekem 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á 8e não 8 week. 8 semanas tem um espaço entre 8 e semana e, portanto, quero dividir a linha na guia.

bash array
  • 1 1 respostas
  • 24238 Views

1 respostas

  • Voted
  1. Best Answer
    ilkkachu
    2017-12-14T10:15:41+08:002017-12-14T10:15:41+08:00

    A atribuição de matriz tmp=(${line///})divide o valor em qualquer caractere que IFScontenha, 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, defina IFSassim:

    foo=$'a\tk\testis\tadult\tmale\t8 week\tRNA'
    IFS=$'\t'
    tmp=($foo)
    echo "${tmp[5]}"
    

    Embora isso ainda deixe o globbing como um problema e, como você já está usando while read, você pode usar read -a tmp(somente no Bash, substitua -apor -Aksh/zsh/yash), ele divide a linha de entrada com base em IFSe armazena os campos resultantes como elementos de a 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 disso é que a alteração IFSsó tem efeito durante o read, não para o restante do script.

    Cuidado, no entanto, que readremove os campos vazios ao usar a tabulação como delimitador. Em zsh, você pode substituir IFS=$'\t'por IFS=$'\t\t'para impedir que isso aconteça.

    Claro, se soubermos o número/significado dos campos, poderíamos apenas readdividi-los para separar as variáveis ​​nomeadas:

    ... IFS=$'\t' read -r col1 col2 col3 ...
    

    Ou, se você quiser imprimir apenas uma coluna, use cut:

    cut -d$'\t' -f 6  < file.txt
    

    Se você tiver colunas vazias cut -d$'\t'e IFS=$'\t'tiver um comportamento diferente em relação a elas. Cut tratará cada tabulação individual como um separador distinto, enquanto readusará tabulações consecutivas como apenas um único separador. Ou seja, a string foo<tab><tab>barserá lida como apenas duas colunas por read, mas três colunas por cut.

    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.

    • 16

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve