Sed qsub内部的Awk
我有一个bash脚本,其中有几个qsub。他们每个人都在等待一个预先的qsub在开始之前完成 我的第一个qsub包括将某个目录中的文件发送到perl程序,并将输出文件打印到新目录中。最后,我用我所有的作业名称回显数组。此脚本按预期工作Sed qsub内部的Awk,sed,awk,echo,qsub,Sed,Awk,Echo,Qsub,我有一个bash脚本,其中有几个qsub。他们每个人都在等待一个预先的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_
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脚本生成的所有文件排序到一个新的输出文件中,并在所有这些作业完成后(大约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"
我的问题是,在我的排序文件中,我有几个列要删除(2到6),因此我使用awk
管道将最后一行传输到sed
,并使用另一个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
,但将其保留为空。我在echo之前添加了SED=
,因为它会给我命令notfound
我试着不用烟斗,这样它就能把所有的东西都打印出来。不幸的是,它什么也不打印。
我假设它没有打开我的排序文件,这就是为什么我的最终文件在sed之后是空的。如果是这样的话,为什么awk不读呢
在我的脚本中,我使用变量来定义我的目录和文件(使用正确的路径)。我知道我的问题不是查找我的文件或目录,因为它们在一开始就被完美地定义并在整个脚本中使用。我尝试编写整个路径而不是变量,得到了相同的结果。我使用的
awk
版本不喜欢转义字符
awk——版本GNU Awk 3.1.7 请尝试以下语法
awk '{for(i=2;i<=7;i++) $i="";print}' foo.txt
资源
我使用的
awk
版本不喜欢转义字符
awk——版本GNU Awk 3.1.7 请尝试以下语法
awk '{for(i=2;i<=7;i++) $i="";print}' foo.txt
资源
将此简化为
for ID_FILES in Infiles_dir/*.txt
ls
列出您传递给它的文件(除非您传递给它目录,然后它会列出它们的内容)。与其告诉它显示文件列表并解析输出,不如使用您已有的文件列表!这更可靠(如果文件名包含空格或通配符,则解析ls
的输出将失败),更清晰、更快
如果你在正确的地方使用正确的引用形式,你的生活会变得更简单。不要使用反引号,因为很难知道如何引用里面的内容,它完全是等价的,只是它是以一种理智的方式解析的
我建议对要馈送到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
)
成为echo
命令参数的字符串是:
awk '{$2=;$3=;$4=;$5=;$6=; print $0}' sorted_file.txt | sed 's/ //g' >final_file.txt
这在语法上是不正确的,这就是你没有得到任何输出的原因
您没有逃过awk代码段中的双引号。如果您使用here文档,则会更清楚。此外,您不需要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-j oe-W depend=“afterany$SORT\u数组”
将此简化为
for ID_FILES in Infiles_dir/*.txt
ls
列出您传递给它的文件(除非您传递给它目录,然后它会列出它们的内容)。与其告诉它显示文件列表并解析输出,不如使用您已有的文件列表!这更可靠(如果文件名包含空格或通配符,则解析ls
的输出将失败),更清晰、更快
如果你在正确的地方使用正确的引用形式,你的生活会变得更简单。不要使用反引号,因为很难知道如何引用里面的内容,它完全是等价的,只是它是以一种理智的方式解析的
我建议对要馈送到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
)
成为echo
命令参数的字符串是:
awk '{$2=;$3=;$4=;$5=;$6=; print $0}' sorted_file.txt | sed 's/ //g' >final_file.txt
这在语法上是不正确的,这就是你没有得到任何输出的原因
您没有逃过awk代码段中的双引号。如果您使用here文档,则会更清楚。此外,您不需要SED=
部分。你加的是b
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