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.
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:
O
printf '%s\n' "${files[@]}" | cut -c1-4 | sort -u
está fazendo o trabalho pesado. Primeiro, oprintf
comando imprime cada elemento do$files
array em uma linha separada. Isso nos dá a lista de nomes de arquivo, e então selecionamos os primeiros 4 caracteres comcut -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 prefixossort -u
para remover duplicatas, e então os alimentamos para o loop.Usei
cat "$prefix"*
instead ofcat *"$prefix"*
como você usou na pergunta, pois todos esses são prefixos e não há nada que corresponda antes deles.No Bash você pode fazer:
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:
O que significa que arquivos chamados
ajac*
, classificados alfanumericamente, serão unidos emajac_combined
, que arquivos chamadosareg*
, classificados alfanumericamente, serão unidos emareg_combined
e assim por diante.Se você precisar restringir isso a nomes de arquivos terminados em
.24o
:Você pode fazer isso em um único comando de linha:
"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.