各ディレクトリには、300を超えるテキストファイルを含む30のディレクトリがあります。各ディレクトリ内のすべてのテキストファイルは同じ命名形式を持ちます。
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
オプションではありませんが、GNUオプションを使用する場合、もう1つのアプローチはGNUオプションをls
使用することです。ls
-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