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

时间:2016-11-24 15:36:54

标签: bash csv export-to-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个文本文件具有相同的命名格式,我只需要一行文件名为标题和目录名称作为csv文件中的列

1 个答案:

答案 0 :(得分:2)

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

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

并更改"就地",只需启用-i选项(如果系统中没有,请使用临时文件并移回原始文件)

现在您的文件排序:问题是通配符匹配甚至ls对文件进行排序,但使用字母顺序,以便regional_vol_GM2.txtregional_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列,名字中没有空格,应该没问题
  • 如果目录路径中有cd并且排序会找到错误的字段,则必须执行M

你应该做些什么来简单地解决这个问题:

  • 你应该生成你的文件/询问那些做零填充的人:1变成001,2变成002等等所以字母数字排序工作,不需要做复杂的sort黑客。 / LI>