Como eu crio loops para unir grupos de arquivos dentro de um diretório?

0

Eu tenho muitos arquivos muito grandes que demoram muito para serem adicionados manualmente. Eles se parecem com algo assim:

  • file_a1.txt
  • arquivo_a2.txt
  • arquivo_a3.txt
  • arquivo_b1.txt
  • arquivo_b2.txt
  • arquivo_b3.txt
  • file_c1.txt
  • file_c2.txt
  • file_c3.txt e assim por diante. Como eu uno todos os a juntos, todos os b juntos e depois todos os c's usando um loop?
por Danielle 13.09.2018 / 05:46

1 resposta

0

Estou assumindo que, ao "unir", você quer dizer concatenar e não "executar uma operação JOIN relacional entre eles usando o comando join ". Além disso, presumo que os nomes dos arquivos sigam o padrão file_XN.txt , em que X é uma única letra e N é algum número e que todos os arquivos estão localizados no diretório atual.

Concatenação de arquivos é feita usando o comando cat , então você teria que chamar cat com todos os " a -files", depois " b -files", etc., enquanto escreve a saída para algum arquivo apropriadamente chamado.

for filename in ./file_[a-z]*.txt; do
    # extract the letter
    letter=${filename#*_}     # ./file_XN.txt --> XN.txt
    letter=${letter%[0-9]*}   # XN.txt --> X

    cat "$filename" >>"combined_$letter.txt"
done

Isso faria um loop em todos os arquivos e extrairia a letra do nome do arquivo. A carta seria então usada para construir o nome do arquivo de saída e o conteúdo do arquivo atual seria anexado ao arquivo de saída.

Os dados seriam anexados na mesma ordem em que os arquivos seriam listados no diretório por padrão.

Outra maneira mais curta de fazer isso, se você estiver usando bash e souber exatamente as letras que deseja passar (usando a até t aqui):

for letter in {a..t}; do
    cat "file_$letter"*.txt >"combined_$letter.txt"
done

Aqui, em vez de percorrer os nomes dos arquivos, fazemos um loop sobre as letras e, para cada letra, concatenamos todos os arquivos para essa letra de uma só vez.

    
por 13.09.2018 / 09:17