私はシェルスクリプトに初めて触れたので、以前にこの質問を受けたことがある場合はお詫び申し上げます。
次のcoordinates.txtファイルがあります。
765442
866447
755343
097754
ファイル内の各行の各値を変数に渡し、その値をコマンドラインの入力として1つずつ使用し、その数値をファイル名の一部として保存したいと思います。次のコードを書きましたが、これが正しい方法であるかどうかはわかりません...
cat coordinates.txt | while read LINE; do
var="$(echo $LINE)"
/home/users/scripts/TreeView/TreeView.sh -o $NAME_ALL.chr1.new_estimate.trees.$var --bp_of_interest $var
done
したがって、出力-oでは、各値は一度に1つずつファイル名に追加され、各値は一度に1つずつ--bp_of_interestとしても使用されます。
どんな提案でも高く評価いたします。ありがとう
答え1
あなたのループは次のように書くのが最善です。
PATH=/home/users/scripts/TreeView:$PATH
while IFS= read -r line; do
TreeView.sh -o "$name_all.chr1.new_estimate.trees.$line" --bp_of_interest "$line"
done <coordinates.txt
これにより、以下が変更されます。
/home/users/scripts/TreeView
正面に追加しました$PATH
。これにより、TreeView.sh
絶対パスを追加せずに呼び出しを行うことができます。var
入力ファイルから読み取った値と同じ値なので、変数を削除しました。- 私が使う
IFS= read -r line
理由は、「「IFS=read-r-line」を理解する」。 - 私は「という理由で変数名を小文字として使用します。シェルスクリプトの変数の命名規則はありますか?」。
cat
この場合は不要なので、リダイレクトを介してファイルのデータをループに渡します。
同じタスクを実行する別の方法:
PATH=/home/users/scripts/TreeView:$PATH
xargs -I {} TreeView.sh -o "$name_all.chr1.new_estimate.trees.{}" --bp_of_interest "{}" <coordinates.txt
xargs
各行から読み取られたデータを、それが表す場所のスクリプトcoordinates.txt
パラメータに挿入するために使用されます。TreeView.sh
{}
コマンドライン(例:before、数字はどこにあります)-P n
に加えて、スクリプトの複数の並列インスタンスを一度に実行することもできます。各インスタンスはそのコマンドラインに適切なデータを挿入します。xargs
-I {}
n
coordinates.txt