我有 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
输出--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