ファイルの各行を別の変数に保存し、コマンドラインの入力と出力で各変数を1つずつ使用します。

ファイルの各行を別の変数に保存し、コマンドラインの入力と出力で各変数を1つずつ使用します。

私はシェルスクリプトに初めて触れたので、以前にこの質問を受けたことがある場合はお詫び申し上げます。

次の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 {}ncoordinates.txt

おすすめ記事