Shell-Script
對每個目錄中的目錄和文件進行升序排序,並將數據導出為csv
我有 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
如果您的問題是順序是詞彙而不是數字,您可以使用
zsh
並執行以下操作:for dir in *(n/); do tail -q -n 1 "$dir"/t1/regional_vol*.txt(n) | paste -s -d ',' - done > data.csv
n
glob 限定符導致排序是數字的。如果 using
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
和使用的輸出!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