ターミナルコマンドラインで次のことを試みます。
ディレクトリの各サブフォルダにあるテキストファイル(allMovement_Regressors.txt、12列、548行)を同じサブフォルダに格納されているcsvファイルに変換します。このコードを試しましたが、各データセットが一緒に積み重ねられたファイルのみが提供されました。
cat */*/*/*/allMovement_Regressors.txt | tr -s '[:blank:]' ',' > ofile.csv
ディレクトリ構造:
/Volumes/My\ Book\ Studio/Directory/1/Results/allMovement_Regressors.txt
/Volumes/My\ Book\ Studio/Directory/2/Results/allMovement_Regressors.txt
/Volumes/My\ Book\ Studio/Directory/3/Results/allMovement_Regressors.txt
各サブフォルダ内のすべてのcsvファイルを1つのcsvファイルにリンクします。デルタデータは前のデータセットの右側にリンクされ、列はサブフォルダ名と変数の順序で次のように命名されます。
1_1 1_2 1_3 1_4 1_5 1_6 1_7 1_8 1_9 1_10 1_11 1_12 2_1 2_2 2_3 2_4 2_5 2_6 2_7 2_8 2_9 2_10 2_11 2_12 3_1 3_2 3_3 3_4 3_5 3_6 3_7 3_8 3_9 3_10 3_11 3_12
とても感謝しています。
答え1
別々のcsvファイルを生成するには:
$ find /Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.txt' \
-exec bash -c 'tr -s "[:blank:]" "," < "$1" > "${1%.txt}.csv"' tocsv {} \;
"tocsv"はexecのbashスクリプト名でプロセスリストに表示されます。
"allMovement_Regressors.txt"を含むディレクトリの数がわかっている場合は、次のようにヘッダー行を作成できます(Xを正しい番号に置き換えます)。
printf '%s,' {1..X}_{1..12} | sed 's/,$/\n/' > ofile.csv
そしてそれらを1つにまとめます。
$ find /Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.csv' -print0 \
| sort -z \
| xargs -0 paste \
| tr '\t' ',' >> ofile.csv
ファイルはpaste
一緒に結合される前に数字でソートされます。-print0
ファイル名にスペースがあるため、ここではこれを使用しています。paste
CSVでは不要なタブ区切りの列を使用するため、この列も交換する必要があります。
修正する
@bu5hmanがタイトルの作り方に答えてくれました。私はこれを完全に盗んでいます!私の答えが好きなら、@bu5hmanの答えを是非とも賛成してください:-)
回答を統合して、thingy.sh
次に提供できるスクリプトを作成してください-exec
。
#!/bin/bash
t=$(echo "$1" | grep -Po "(?<=/)[0-9]+(?=/)")
u=$(echo 1_$(seq -s " ${t}_" $(cat "$1" | awk "{print NF}")))
sed "i \\$u" "$1" \
| tr -s "[:blank:]" "," > "${1%.txt}.csv"
その後、入力してください-exec
。
find Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.txt' \
-exec /path/to/thingy.sh {} \;
次に、2番目のfind
コマンドを使用してすべてを1つにまとめます。
答え2
上記でファイルのaggregationに対する回答がうまくいったので、aggregationの前に各ファイルにヘッダーを挿入する方法は次のとおりです。ラベルには数字のみのディレクトリを使用し、フィールド数に制限はありません。
テストのためにsedから削除されました-i
...
find ./tmp -type f -name "qwerty" -exec sh -c 't=$(echo "$1" | grep -Po "(?<=/)[0-9]+(?=/)"); u=$(echo ${t}_$(seq -s " ${t}_" $(cat "$1" | awk "{print NF}"))); sed -i "i \\$u" "$1"' sh {} \;
ファイルは次の場所にあります。/home/bu5hman/tmp/1/end/qwerty
コンテンツ
q w e r t y u i o p
出力
1_1 1_2 1_3 1_4 1_5 1_6 1_7 1_8 1_9 1_10
q w e r t y u i o p
もちろん、元のファイルを保存するために、出力を一時ファイルセットにリダイレクトすることもできます。
答え3
paste
代わりにあなたが望むcat
:
paste -d' ' */*/*/*/allMovement_Regressors.txt | tr -s '[:blank:]' ',' > ofile.csv