Если ваша проблема в том, что порядок лексический, а не числовой, вы можете использовать zsh
и выполнить:
for dir in *(n/); do
tail -q -n 1 "$dir"/t1/regional_vol*.txt(n) | paste -s -d ',' -
done > data.csv
Квалификатор глобуса n
заставляет сортировку быть числовой.
Если использование zsh
не является вариантом, но ваш ls
является вариантом GNU, альтернативой является использование GNU ls
s -v Параметр
для версии sort:
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
и с использованием eval
в той же команде !
Но здесь это безопасно, поскольку 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