Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 与qsub一起使用awk,并与报价一起发布_Bash_Awk - Fatal编程技术网

Bash 与qsub一起使用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结合使用时,它会返回以下内

我正在尝试运行一个脚本,该脚本将按照以下行提交一组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结合使用时,它会返回以下内容:

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}"