2

いくつかのqsubを含むbashスクリプトがあります。それらのそれぞれは、開始する前に前の qsub が完了するのを待っています。

私の最初の qsub は、特定のディレクトリ内のファイルを perl プログラムに送信し、出力ファイルを新しいディレクトリに出力することで構成されています。最後に、すべてのジョブ名を配列にエコーします。このスクリプトは意図したとおりに機能します。

mkdir -p /perl_files_dir
for ID_FILES in `ls Infiles_dir/*.txt`;
do
JOB_ID=`echo "perl perl_scirpt.pl $ID_FILES" | qsub -j oe `
JOB_ID_ARRAY="${JOB_ID_ARRAY}:$JOB_ID" 
done
echo $JOB_ID_ARRAY

私の 2 番目の qsub は、perl スクリプトで作成した以前のすべてのファイルを新しい出力ファイルに並べ替え、これらすべてのジョブ (約 100 ジョブ) が完了した後にdepend=afterany. 繰り返しますが、この部分は正常に機能しています。

SORT_JOB=`echo "sort -m -n perl_files_dir/*.txt  >>sorted_file.txt" | qsub -j oe -W depend=afterany$JOB_ID_ARRAY`
SORT_ARRAY="${SORT_ARRAY}:$SORT_JOB"

awk私の問題は、ソートさsedれたファイルに、削除したい列がいくつかあることです (2 から 6)。depend=afterany

SED=`echo "awk '{\$2="";\$3="";\$4="";\$5="";\$6=""; print \$0}' sorted_file.txt \
| sed 's/     //g' >final_file.txt" | qsub -j oe -W depend=afterany$SORT_ARRAY`

この最後のステップfinal_file.txtで が作成されますが、空のままになります。エコーの前に追加SED=したのは、そうしないとCommand not found.

パイプなしで試したので、すべてが印刷されます。残念ながら、何も印刷されません。ソートされたファイルを開いていないと思います。これが、sedの後に最終ファイルが空になる理由です。もしそうなら、なぜ awk はそれを読まないのでしょうか?

私のスクリプトでは、変数を使用してディレクトリとファイルを (正しいパスで) 定義しています。ファイルやディレクトリは最初に完全に定義され、スクリプト全体で使用されるため、私の問題はファイルやディレクトリを見つけることではないことを私は知っています。変数の代わりにパス全体を書き込もうとしましたが、同じ結果が得られました。

4

2 に答える 2

-1

awk私が使用しているバージョンは、文字のエスケープが好きではありません

awk --version
GNU Awk 3.1.7

spuder@cent64$ awk '{\$2="";\$3="";\$4=""; print \$0}' foo.txt 
awk: {\$2="";\$3="";\$4=""; print \$0}
awk:  ^ backslash not last character on line

次の構文を試してください

awk '{for(i=2;i<=7;i++) $i="";print}' foo.txt

補足として、Torque 4.x を使用している場合、ジョブのコンマ区切りリストを で使用できない場合 -W depend=があります。代わりに、ジョブごとに新しい PBS 宣言 (-W) を作成する必要がある場合があります。

例えば...

#Invalid syntax in newer versions of torque 
qsub -W depend=foo,bar

資力

gawk フィールドのバックスラッシュ
最初の 3 列を除くすべてを出力
http://docs.adaptivecomputing.com/torque/help.htm#topics/commands/qsub.htm#-W

于 2013-08-05T00:40:29.590 に答える