【问题标题】:Bash script Sort the text files in directory and export data into csvBash脚本对目录中的文本文件进行排序并将数据导出为csv
【发布时间】:2017-04-08 23:32:47
【问题描述】:

我的驱动器中有 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 文件中的列

【问题讨论】:

    标签: bash csv export-to-csv


    【解决方案1】:

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

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

    要更改“就地”,只需启用-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 之后)。

    为什么是 hack:

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

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

    • 您应该生成您的文件/要求执行此操作的人使用零填充:1 变为 001,2 变为 002,等等。因此字母数字排序有效,无需执行复杂的 sort hack。

    【讨论】:

    • sed 命令也无法实际更改文件,也许也解决了这个问题?
    • 是的 sed 命令不起作用,我仍然得到错误的输出,而不是目录 1 中的值,我从目录 100 中获取值
    • @Jean-FrançoisFabre ,它的作品,但有一个问题,因为我有 45 个目录,目录没有按顺序排序,抱歉再次改写我的问题,我需要对目录和文件进行排序在目录内并按顺序排列并将每个目录中的数据导出到csv
    • 您的 .csv 文件中是否有 很多 重复信息?因为我认为paste 命令不应该在循环内。排序问题是因为字母数字排序与数字排序。我想我可以解决它,但首先要回答我的第一个问题。
    • 是的,粘贴命令应该在循环之外,我已经改变了,我认识到了错误
    猜你喜欢
    • 2021-10-28
    • 2021-12-16
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2017-04-07
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多