0

ここに新しい人が問題を抱えており、うまくいけば簡単な解決策があると思いますが、私は管理できないようです.

そのため、同じコマンド ライン プログラムを使用して処理する必要があるファイルの大きなリストがあり、これを自動化する小さなシェル スクリプトを作成しようとしています。テキストファイルから入力ファイル名を読み取り、それらのファイルごとにコマンドを繰り返すものを書きました。ここまでは順調ですね。私の問題は、出力に名前を付けることです。各ファイルは「lane_number_bla_bla_bla」という一般的な形式で名前が付けられ、ペアで処理されます。そのため、「lane_1_bla_bla_bla_001」と「lane_1_bla_bla_bla_002」を 1 つの出力ファイルに結合する必要があります。このために、awk を使用して入力ファイルの .txt リストからサンプル番号を読み取り、それを出力ファイル番号に解析しようとしています。これが私が思いついたコードです(コマンドの前のechoステートメントはテストのためだけにあることに注意してください。実際のプログラムの実行に関しては削除されます。また、これは実際のコマンドではなく、かなり複雑ですが、原則は適用されます):

echo "Which input1 should I use?"
read text
input1=$text
echo "Which input2 should I use?"
read text
input2=$text
echo "How many lines?"
read text
n=$text
for i in $(seq 1 $n)
do
  awkinput1=$(awk NR==$i $input1)
  awkinput2=$(awk NR==$i $input2)
  num=$(awk 'NR==$i{print $2 }' FS="_" $input1)
  lane=$(awk 'NR==$i{print $1 }' FS="_" $input1)
  echo "command $awkinput1.in > $awkinput1.out && command $awkinput2.in > $awkinput2.out && command cat $awkinput1.out $awkinput2.in > $num-$lane-CAT.out &"
  if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done

これを実行すると、両方の $awkinput フィールドがコマンド ラインで適切なファイル名に適切に置き換えられますが、何も出力しない $num フィールドと $lane フィールドは置き換えられません。

それで、私は何を間違っていますか?かなり単純だと思いますが、関連する awk コマンドをフォーマットするためにさまざまな方法を試しましたが、何も機能していないようです。違いがある場合は、SSHプロトコルを使用してリモートLinuxサーバーでこれを行っています。

どうもありがとう!

4

1 に答える 1

1
  1. $iシェルは、一重引用符 ( ) で囲まれた引用を解析しません'。したがって、引用符で囲まれた文字列は の前で終了する必要があります$i
  2. FS行を解析する前に設定する必要があります。

次のコードが機能します。

num=$(awk 'BEGIN{FS="_"} NR=='$i'{print $2 }' $input1)
lane=$(awk 'BEGIN{FS="_"} NR=='$i'{print $1 }' $input1)

以下のコードはより効率的です。

while read in1 ; do
  read in2 <&3
  num=$(awk 'BEGIN{FS="_"} {print $2 }' <<<"$in1")
  lane=$(awk 'BEGIN{FS="_"} {print $1 }' <<<"$in1")
  ...
done <$input1 3<$input2
于 2013-02-07T15:24:27.310 に答える