我有一个bash脚本,其中有几个qsubs。他们中的每一个人都在等待着在开始之前做一个预先的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我的第二个qsub是用来在一个新的外部文件中对我以前用perl脚本创建的所有文件进行排序,并在使用depend=afterany完成所有这些工作(大约100个任务)之后开始。再一次,这部分运转良好。
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"我的问题是,在我的排序文件中,我有一些列希望删除(2到6),所以我使用awk与另一个depend=afterany一起使用管道到sed的最后一行。
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之后,我的最后一个文件是空的。如果是这样的话,那为什么沃克不看呢?
在我的脚本中,我使用变量来定义我的目录和文件(有正确的路径)。我知道我的问题不在于找到我的文件或目录,因为它们在一开始就被完美地定义,并在整个脚本中使用。我尝试编写整个路径,而不是变量,得到了相同的结果。
发布于 2013-08-06 07:25:21
用于ID_FILES中的
ls Infiles\_dir/\*.txt
把这个简化成
for ID_FILES in Infiles_dir/*.txtls列出您传递它的文件(除非您传递它的目录,然后它列出了它们的内容)。不要让它显示文件列表并解析输出,而是使用您已经拥有的文件列表!这更可靠(如果文件名包含空白或通配符,解析ls的输出将失败),更清晰、更快。ls。
SORT_JOB=
echo "sort -m -n perl\_files\_dir/\*.txt >>sorted\_file.txt" | qsub -j oe -W depend=afterany$JOB\_ID\_ARRAY
如果你在正确的地方使用正确的引语形式,你的生活会变得更简单。不要使用反引号,因为很难知道如何引用内部的内容。相反,,它是完全等价的,只不过它是以一种理智的方式被解析的。
我建议将这里文件用于您要输入到qsub的shell代码段。您需要担心的引用问题较少,而且可读性更强。
当我们这样做的时候,总是把双引号放在变量替换和命令替换的周围:"$some_variable","$(some_command)"。令人烦恼的是,shell语法中的$var并不意味着“获取变量var的值”,而是“获取变量var的值,将其解析为通配符模式列表,如果存在匹配的文件,则将每个模式替换为匹配的文件列表”。如果替换发生在双引号内(顺便说一下,在这里的文档中),则会关闭这个额外的内容:"$var"的意思是“获取变量var的值”。
SORT_JOB=$(qsub -j oe -W depend="afterany$JOB_ID_ARRAY" <<'EOF'
sort -m -n perl_files_dir/*.txt >>sorted_file.txt
EOF
)我们现在到了引文实际上引起问题的片段。
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
成为echo命令的参数的字符串是:
awk '{$2=;$3=;$4=;$5=;$6=; print $0}' sorted_file.txt | sed 's/ //g' >final_file.txt这在语法上是不正确的,这就是为什么你没有得到任何输出。
在所谓的awk片段中,你没有逃脱双引号。如果您使用这里的文档,则会更加清楚。另外,您不需要SED=部分。添加它是因为您有一个命令替换(…之间的一个命令),它替代了命令的输出。但是,由于您对qsub命令的输出不感兴趣,所以不要接受它的输出,只需执行它。
qsub -j oe -W depend="afterany$SORT_ARRAY" <<'EOF'
awk '{$2="";$3="";$4="";$5="";$6=""; print $0}' sorted_file.txt |
sed 's/ //g' >final_file.txt
EOF我不熟悉qsub,但可能有一种方法可以获得它运行的命令的错误输出和返回状态。检查错误输出,您应该已经看到来自awk的错误。
发布于 2013-08-05 00:40:29
我使用的awk版本,不喜欢转义字符
awk -版本 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资源
http://docs.adaptivecomputing.com/torque/help.htm#topics/commands/qsub.htm#-W
https://stackoverflow.com/questions/18024859
复制相似问题