Bash 与qsub一起使用awk,并与报价一起发布
我正在尝试运行一个脚本,该脚本将按照以下行提交一组awk命令:Bash 与qsub一起使用awk,并与报价一起发布,bash,awk,Bash,Awk,我正在尝试运行一个脚本,该脚本将按照以下行提交一组awk命令: qsub -l h_vmem=32G -l h_rt=04:00:00 "awk '{if (last != $10) close(last); print >> "/directory/working/"$10 ".txt"; last = $10}' /directory/working/working_file.txt" 当在交互式会话中运行时,awk命令本身工作正常,问题是当与qsub结合使用时,它会返回以下内
qsub -l h_vmem=32G -l h_rt=04:00:00 "awk '{if (last != $10) close(last); print >> "/directory/working/"$10 ".txt"; last = $10}' /directory/working/working_file.txt"
当在交互式会话中运行时,awk命令本身工作正常,问题是当与qsub结合使用时,它会返回以下内容:
error opening awk '{if (last != 0) close(last); print >> '/directory/working: No such file or directory
起初,我认为这可以通过将整个awk命令放在双引号中来解决,正如我在上面所做的那样,但这也返回了相同的错误。我对此的理解是,由于awk命令中额外的双引号,它无法工作。但据我所知,我需要在命令中使用那些额外的双引号
我试着改变它,使第一组双引号中的每个引号都只是单引号,但这不起作用。然后我试着:
qsub -l h_vmem=32G -l h_rt=04:00:00 "$(awk ...)"
但这似乎也不起作用,或者至少在提交之后,它没有返回错误,但实际上似乎没有提交
有什么方法可以解决这个问题吗?使用多个级别的引用可能会引入错误,因此最好避免 qsub似乎希望脚本或可执行程序的文件名后跟参数。但是,这两种情况下的语法不同。见: 因此,最简单的解决方案似乎不是嵌套引号,而是预先添加-: 对于较长的命令行,最好将脚本保存为文件,qsub可以在某个地方找到它,这样就不必担心引用 如果必须在其他情况下嵌套引号,可以使用bash v4.4+来显示所需内容:
raw=$(cat <<'EOD'
awk '{if (last != $10) close(last); print >> "/directory/working/"$10 ".txt"; last = $10}' /directory/working/working_file.txt
EOD
)
quoted="${raw@Q}"
我对qsub一无所知,请尝试使用\代替打印字符串所需的引号。除了Sundeep的注释外:$10将在传递给qsub甚至awk之前扩展为空字符串。请注意,双引号中的单引号不引用任何内容,它们只是文字字符。写\$10而不是$10。我相信这应该已经解决了这个问题,并且比使用\的评论中的建议更优雅。然而,我怀疑,由于我的服务器在尝试运行此程序时存在一些缺陷,它基本上似乎拒绝执行任何操作。虽然我没有发现任何错误,但我确实怀疑,如果我没有遇到一些问题,这应该是可行的。
qsub -l h_vmem=32G -l h_rt=04:00:00 -- awk '{if (last != $10) close(last); print >> "/directory/working/"$10 ".txt"; last = $10}' /directory/working/working_file.txt
raw=$(cat <<'EOD'
awk '{if (last != $10) close(last); print >> "/directory/working/"$10 ".txt"; last = $10}' /directory/working/working_file.txt
EOD
)
quoted="${raw@Q}"