首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qsub内部Awk

qsub内部Awk
EN

Stack Overflow用户
提问于 2013-08-02 19:34:18
回答 2查看 841关注 0票数 2

我有一个bash脚本,其中有几个qsubs。他们中的每一个人都在等待着在开始之前做一个预先的qsub。

我的第一个qsub包括将某个目录中的文件发送到perl程序,并在一个新目录中打印输出文件。最后,我用我所有的作业名称回显数组。这个脚本效果很好。

代码语言:javascript
复制
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个任务)之后开始。再一次,这部分运转良好。

代码语言:javascript
复制
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的最后一行。

代码语言:javascript
复制
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之后,我的最后一个文件是空的。如果是这样的话,那为什么沃克不看呢?

在我的脚本中,我使用变量来定义我的目录和文件(有正确的路径)。我知道我的问题不在于找到我的文件或目录,因为它们在一开始就被完美地定义,并在整个脚本中使用。我尝试编写整个路径,而不是变量,得到了相同的结果。

EN

回答 2

Stack Overflow用户

发布于 2013-08-06 07:25:21

用于ID_FILES中的ls Infiles\_dir/\*.txt

把这个简化成

代码语言:javascript
复制
for ID_FILES in Infiles_dir/*.txt

ls列出您传递它的文件(除非您传递它的目录,然后它列出了它们的内容)。不要让它显示文件列表并解析输出,而是使用您已经拥有的文件列表!这更可靠(如果文件名包含空白或通配符,解析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的值”。

代码语言:javascript
复制
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命令的参数的字符串是:

代码语言:javascript
复制
awk '{$2=;$3=;$4=;$5=;$6=; print $0}' sorted_file.txt | sed 's/     //g' >final_file.txt

这在语法上是不正确的,这就是为什么你没有得到任何输出。

在所谓的awk片段中,你没有逃脱双引号。如果您使用这里的文档,则会更加清楚。另外,您不需要SED=部分。添加它是因为您有一个命令替换(之间的一个命令),它替代了命令的输出。但是,由于您对qsub命令的输出不感兴趣,所以不要接受它的输出,只需执行它。

代码语言:javascript
复制
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的错误。

票数 0
EN

Stack Overflow用户

发布于 2013-08-05 00:40:29

我使用的awk版本,不喜欢转义字符

awk -版本 GNU Awk 3.1.7

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

尝试以下语法

代码语言:javascript
复制
awk '{for(i=2;i<=7;i++) $i="";print}' foo.txt

另外,如果您使用Torque 4.x,您可能无法使用带有-W depend=的逗号分隔的作业列表,相反,您可能需要为每个作业创建一个新的PBS声明性(-W)。

例如..。

代码语言:javascript
复制
#Invalid syntax in newer versions of torque 
qsub -W depend=foo,bar

资源

gawk字段中的反斜杠

打印除前三列外的所有

http://docs.adaptivecomputing.com/torque/help.htm#topics/commands/qsub.htm#-W

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18024859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档