Bash 脚本对目录中的文本文件进行排序并将数据导出到csv

Bash script Sort the text files in directory and export data into csv

我的驱动器中有 45 个目录,命名格式为 Sub1,Sub2..Sub45,每个目录包含 300 多个文本文件,每个目录中的所有文本文件具有相同的命名格式

regional_vol_GM1.txt
regional_vol_GM2.txt
regional_vol_GM*.txt 

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

以下是我写的脚本

    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

现在我想用文本文件的文件名作为行值和目录名作为列来改造我的输出 csv 文件,因为每个目录都有 300 个具有相同命名格式的文本文件,我只需要一个文件的单行名称为 header,目录名称为 csv 文件中的列

x 中有一个 /,因此在您的表达式中。将您的 sed 分隔符更改为 x 中不太可能出现的内容,例如:

sed -i "1s#^#${x}\n#" ${x}

并更改 "in-place",只需启用 -i 选项(如果您的系统不可用,请使用临时文件并移回原始文件)

现在进行文件排序:问题是通配符匹配甚至 ls 对文件进行排序,但使用字母顺序,因此 regional_vol_GM2.txt 之后 regional_vol_GM100.txt.

所以即使它有点乱,你也可以替换它:

tail -q -n 1 "$dir"/t1/regional_vol*.txt

通过这个:

tail -q -n 1 (cd "$dir"/t1;ls -C1 regional_vol_GM*.txt | sort -k2 -tM -n)

为什么有效:

  • 我正在使用 sort 的数字模式,使用第二个字段,由 M 分隔(数字在 _GM 之后)。

为什么它是黑客:

  • 它依赖于 ls 的输出,这通常是不受欢迎的。这是一个简单的 ls on 1 column,你的名字中没有空格,应该没问题
  • 它必须执行 cd 以防目录路径中有 M 并且排序会找到错误的字段

您应该如何简单地解决这个问题:

  • 你应该生成你的 files/ask 这样做的人用零填充:1 变成 001,2 变成 002,等等。所以字母数字排序有效,不需要做复杂的 sort hack.