各ディレクトリのディレクトリとファイルを昇順に並べ替え、データをcsvにエクスポートします。

各ディレクトリのディレクトリとファイルを昇順に並べ替え、データをcsvにエクスポートします。

各ディレクトリには、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そして使用eval同じコマンドで!

しかし、ここではと同じ形式でls出力されるので安全です。--quoting-style=shell-alwayseval

行と列のヘッダーを追加するには、次の手順を実行します。

{
  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

おすすめ記事