Classifique os diretórios e arquivos em cada diretório em ordem crescente e exporte os dados para csv

1

Eu tenho 30 diretórios Eu tenho mais de 300 arquivos de texto em cada, todos os arquivos de texto em cada diretório têm o mesmo formato de nomenclatura

regional_vol_GM1.txt
regional_vol_GM2.txt
regional_vol_GM*.txt 

Gostaria de classificar os diretórios e arquivos de texto em ordem seqüencial e exportar os dados em cada arquivo para o arquivo csv

A seguir, o script que escrevi

for dir in * ; do


   paste -s -d ',' <(tail -q -n 1 "$dir"/t1/regional_vol*.txt ) >> data.csv

 done

O arquivo csv de saída que eu obtenho não está classificado, como pode classificar todos os arquivos em meu diretório em ordem crescente e exportar os dados para csv

    
por DevanDev 24.11.2016 / 17:20

1 resposta

1

Se o seu problema é que o pedido é léxico, em vez de ser numérico, você pode usar zsh e fazer:

for dir in *(n/); do
  tail -q -n 1 "$dir"/t1/regional_vol*.txt(n) | paste -s -d ',' -
done > data.csv

O qualificador n glob faz com que a classificação seja numérica.

Se usar zsh não for uma opção, mas seu ls for o GNU, uma alternativa é usar a opção ls do GNU -v para versão sort:

eval "dirs=($(ls -v --quoting-style=shell-always))"
for dir in "${dirs[@]}"; do
  eval "files=($(
    ls -vd --quoting-style=shell-always -- "$dir"/t1/regional_vol*.txt))"
  tail -q -n 1 -- "${files[@]}" | paste -sd , -
done > data.csv

Sim, isso é analisando a saída de ls e usando eval no mesmo comando!

Mas aqui, é seguro, pois ls com --quoting-style=shell-always sai no formato exato esperado por eval .

Para adicionar seus cabeçalhos de linha e coluna:

{
  eval "dirs=($(ls -v --quoting-style=shell-always))"
  headers_done=false
  for dir in "${dirs[@]}"; do
    (
      cd -- "$dir/t1" || exit
      eval "files=($(
        ls -vd --quoting-style=shell-always regional_vol*.txt))"
      if ! "$headers_done"; then
        printf DIR
        printf ',%s' "${files[@]}"
        printf '\n'
        headers_done=true
      fi
      printf %s, "$dir"
      tail -q -n 1 -- "${files[@]}" | paste -sd , -
    )
  done
} > data.csv
    
por 24.11.2016 / 17:47