我的驱动器中有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文件中的列
答案 0 :(得分:2)
在/
中有一个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
之后)。为什么它是黑客:
ls
的输出,这通常是不赞成的。这是一个简单的ls on 1列,名字中没有空格,应该没问题cd
并且排序会找到错误的字段,则必须执行M
你应该做些什么来简单地解决这个问题:
sort
黑客。 / LI>