現在、find出力に基づいてRコマンドを生成するスクリプトがあります。
#!/bin/bash
PATHX="/path/to/my/files"
find "${PATHX}" -maxdepth 1 -type f -name "*.csv" | while read d; do
FN=$(echo -n "${d}" | cut -d/ -f5 | cut -d. -f1)
echo "${FN}<-read.csv(\"${PATHX}/${FN}.csv\",header=TRUE)"
# <snip> etc .etc. etc.
echo "${FN}_2y<-tail(${FN}_log,730)"
done
これは素晴らしい作品です。しかし、Rコマンドを使用すると問題が発生しました。
df<-data.frame(list,of,columns,goes,here)
これを上記のfind / whileに統合する方法がわかりません。つまり、リストを出力する必要があります。${FN}_2年data.frame() 関数を入力してください。
たとえば、私のスクリプトが次のように出力されるとします。
- a_2y
- b_2y
- c_2y
df<-data.frame(a_2y,b_2y,c_2y) で終わる必要があります。
コメントの質問をより明確にするために、すべてのcsv入力が解析された後、最後に1つのdata.frameインスタンスのみが必要です。
ベストアンサー1
名前を変数として収集fns
し、最後にその変数をエコーできます。パイプがあるので、変数をwhile / do / doneと同じサブシェルに保持する必要があります。${fns:1}
最初の追加コンマが削除された変数の部分文字列。
#!/bin/bash
PATHX="/path/to/my/files"
find "${PATHX}" -maxdepth 1 -type f -name "*.csv" |
( fns=
while read d; do
FN=$(echo -n "${d}" | cut -d/ -f3 | cut -d. -f1)
echo "${FN}<-read.csv(\"${PATHX}/${FN}.csv\",header=TRUE)"
# <snip> etc .etc. etc.
echo "${FN}_2y<-tail(${FN}_log,730)"
fns+=",${FN}_2y"
done
echo "df<-data.frame(${fns:1})"
)