将目录及各目录下的文件按升序排序,并导出数据到csv

将目录及各目录下的文件按升序排序,并导出数据到csv

我有 30 个目录,每个目录有 300 多个文本文件,每个目录中的所有文本文件都具有相同的命名格式

regional_vol_GM1.txt
regional_vol_GM2.txt
regional_vol_GM*.txt 

我想按顺序对目录和文本文件进行排序,并将每个文件中的数据导出到 csv 文件中

以下是我写的脚本

for dir in * ; do


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

 done

我获得的输出csv文件未排序,如何按升序对目录中的所有文件进行排序并将数据导出到csv

答案1

如果您的问题是顺序是词汇顺序而不是数字顺序,您可以使用zsh并执行以下操作:

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

globn限定符导致排序为数字。

如果使用zsh不是一个选项,但你ls是 GNU 选项,另一种方法是使用 GNUls-v选项版本种类:

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

是的,那就是解析输出ls使用eval在同一个命令中!

但在这里,它是安全的,因为ls输出--quoting-style=shell-always的格式与eval.

要添加行标题和列标题:

{
  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

相关内容