カタログtxtファイルを適切な列名を持つ便利なマージcsvファイルに変換する

カタログtxtファイルを適切な列名を持つ便利なマージcsvファイルに変換する

ターミナルコマンドラインで次のことを試みます。

ディレクトリの各サブフォルダにあるテキストファイル(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ファイル名にスペースがあるため、ここではこれを使用しています。pasteCSVでは不要なタブ区切りの列を使用するため、この列も交換する必要があります。

修正する

@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

関連情報