次のスクリプトの目的は、paste
コマンドを介して複数のテーブルをマージして特定のディレクトリに配置することです。
for i in {1..30}
do
paste ./directory"$i"/table1.txt table2.txt ... table20.txt > ./merged_tables/tables_directory"$i".txt
done
次のエラーが発生します。
paste: file table2: No such file or directory
各テーブルにパスを作成するとうまくいきますが、パスを複数回作成したくありません。各テーブルにパスを作成せずにこれを行う方法はありますか?事前にありがとう
ベストアンサー1
for (( i = 1; i <= 30; ++i )); do
( cd "directory$i" &&
paste tableNC023.txt tableNC088.txt tableNC102.txt ... ) >"./merged_tables/tables_directory$i.txt"
done
cd
これはサブシェルにディレクトリを入力するために使用されます。cd
成功すると、paste
結合されたデータを生成するために使用されます。サブシェルの出力は、以前と同様に結果ファイルにリダイレクトされます。
サブシェルで実行されるので、次の反復のために「戻る」に戻るcd
必要はありません。cd ..
cd -
cd "$OLDPWD"
よりきれいなコードの代替案:
tables=( tableNC023.txt tableNC088.txt tableNC102.txt
more tables here )
for (( i = 1; i <= 30; ++i )); do
( cd "directory$i" &&
paste "${tables[@]}" ) >"./merged_tables/tables_directory$i.txt"
done
私は純粋に個人的な好みに応じて代わりにfor (( i ... ))
使用します。for i in {...}