Tengo 30 directorys, tengo más de 300 files de text en cada uno, todos los files de text en cada directory tienen el mismo formatting de nomenclatura
regional_vol_GM1.txt regional_vol_GM2.txt regional_vol_GM*.txt
Me gustaría orderar los directorys y files de text en order secuencial y exportar los datos en cada file al file csv
A continuación está el guión que he escrito
for dir in * ; do paste -s -d ',' <(tail -q -n 1 "$dir"/t1/regional_vol*.txt ) >> data.csv done
El file csv de salida que obtengo no está orderado, cómo puedo orderar todos los files en mi directory en order ascendente y exportar los datos a csv
Si su problema es que el order es léxico en lugar de ser numérico, puede usar zsh
y hacer:
for dir in *(n/); do tail -q -n 1 "$dir"/t1/regional_vol*.txt(n) | paste -s -d ',' - done > data.csv
El calificador n
glob hace que la sorting sea numérica.
Si usar zsh
no es una opción, pero su ls
es la de GNU, una alternativa es usar la opción -v
GNU ls
para orderar la versión :
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
Sí, eso es analizar la salida de ls
y usar eval
en el mismo command!
Pero aquí, es seguro ya que ls
con --quoting-style=shell-always
el formatting exacto esperado por eval
.
Para agregar sus encabezados de fila y columna:
{ 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