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 / ubuntu / Perguntas / 1529330
Accepted
deepblue_86
deepblue_86
Asked: 2024-10-08 16:53:17 +0800 CST2024-10-08 16:53:17 +0800 CST 2024-10-08 16:53:17 +0800 CST

usando o comando cat com diferentes saídas em um loop

  • 772

Tenho um diretório contendo diferentes arquivos de texto, como:

ajac001a00.24o
ajac001a15.24o
ajac001a30.24o
.
.
areg001a00.24o
areg001a15.24o
areg001a30.24o
.
.

Preciso combinar esses arquivos de texto separadamente, começando com os mesmos quatro caracteres, como

cat *ajac* > ajac_combined
cat *areg* > areg_combined

Como posso fazer isso usando um loop? Há muitos arquivos começando com caracteres diferentes que existem, portanto, isso não pode ser feito usando o comando cat manualmente.

command-line
  • 3 3 respostas
  • 170 Views

3 respostas

  • Voted
  1. Best Answer
    terdon
    2024-10-08T19:10:01+08:002024-10-08T19:10:01+08:00

    Você poderia coletar todos os arquivos em um array, então cortar os primeiros 4 caracteres para obter a lista de prefixos, e então iterar sobre os prefixos para combinar os arquivos. Assim:

    files=(*24o)
    printf '%s\n' "${files[@]}" | cut -c1-4 | sort -u | 
     while read -r prefix; do 
       cat "$prefix"* >> "$prefix"_combined
    done
    

    O printf '%s\n' "${files[@]}" | cut -c1-4 | sort -uestá fazendo o trabalho pesado. Primeiro, o printfcomando imprime cada elemento do $filesarray em uma linha separada. Isso nos dá a lista de nomes de arquivo, e então selecionamos os primeiros 4 caracteres com cut -c1-4. Observe que isso pressupõe nomes de arquivo ASCII simples, sem unicode, de modo que cada caractere é um único byte. Então passamos a lista de prefixos sort -upara remover duplicatas, e então os alimentamos para o loop.

    Usei cat "$prefix"*instead of cat *"$prefix"*como você usou na pergunta, pois todos esses são prefixos e não há nada que corresponda antes deles.

    • 2
  2. kos
    2024-10-08T20:50:37+08:002024-10-08T20:50:37+08:00

    No Bash você pode fazer:

    for f in *; do cat "${f}" >>"${f:0:4}_combined"; done
    

    O que significa: para cada arquivo no diretório de trabalho atual, classificado por nome de acordo com as regras de englobamento do Bash (ou seja, números primeiro, classificados numericamente, seguidos por caracteres, classificados alfabeticamente), anexe o conteúdo do arquivo a um arquivo nomeado com os primeiros 4 caracteres do nome do arquivo, seguidos por _combined.

    Para referência, veja como esses nomes de arquivo seriam classificados:

    % printf '%s\n' *
    ajac001a00.24o
    ajac001a15.24o
    ajac001a30.24o
    areg001a00.24o
    areg001a15.24o
    areg001a30.24o
    

    O que significa que arquivos chamados ajac*, classificados alfanumericamente, serão unidos em ajac_combined, que arquivos chamados areg*, classificados alfanumericamente, serão unidos em areg_combinede assim por diante.

    Se você precisar restringir isso a nomes de arquivos terminados em .24o:

    for f in *.24o; do cat "${f}" >>"${f:0:4}_combined"; done
    

    % for f in *; do printf '%s\n' "${f}"; cat "${f}"; done
    ajac001a00.24o
    DB755B8D04AF76C9AB7F62FEFD5A5DF6
    ajac001a15.24o
    4FC1CE5229CCF7659F4C2BAA9157F237
    ajac001a30.24o
    9765C5B689BE4D8F692E52FC83CFD308
    areg001a00.24o
    BF56C237311136BDBB9EF6EA56D1BF56
    areg001a15.24o
    36D9928DD5537172523C26F9C8765627
    areg001a30.24o
    E482937912B11F56362E358E8F92295A
    % for f in *; do cat "${f}" >>"${f:0:4}_combined"; done
    % for f in *_combined; do printf '%s\n' "${f}"; cat "${f}"; done
    ajac_combined
    DB755B8D04AF76C9AB7F62FEFD5A5DF6
    4FC1CE5229CCF7659F4C2BAA9157F237
    9765C5B689BE4D8F692E52FC83CFD308
    areg_combined
    BF56C237311136BDBB9EF6EA56D1BF56
    36D9928DD5537172523C26F9C8765627
    E482937912B11F56362E358E8F92295A
    
    • 2
  3. Luke Attard
    2024-10-08T21:11:51+08:002024-10-08T21:11:51+08:00

    Você pode fazer isso em um único comando de linha:

    ls -w 1 | awk '{ system("cat "$1" >> "substr($1,1,4)"_combined")}'
    

    "ls -w 1" listará todos os arquivos em uma única coluna e apenas o nome do arquivo, sem outros detalhes.

    O comando awk pegará cada linha e executará o comando do sistema cat the file ($1 = nome do arquivo) para o arquivo começando com as mesmas 4 letras e terminando com _combined.

    o >> no meio significa anexar, então ele adicionará ao arquivo, se não houver nenhum arquivo ele o criará.

    Observe as aspas simples para todo o comando awk e as aspas duplas para o texto estático no cmd.

    • 1

relate perguntas

Sidebar

Stats

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

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

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