Sed qsub内部的Awk

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_

我有一个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_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