Shell-Script

對每個目錄中的目錄和文件進行升序排序,並將數據導出為csv

  • November 24, 2016

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

nglob 限定符導致排序是數字的。

如果 usingzsh不是一個選項,但您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

引用自:https://unix.stackexchange.com/questions/325799