将awk与qsub一起使用,并引起报价问题

时间:2019-03-20 15:51:50

标签: 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结合使用时,它会返回以下内容:

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 ...)"

但这似乎也不起作用(或者至少在提交之后,它没有返回错误,但实际上似乎没有提交。

使用所有不同的报价可以解决这个/任何解决方案吗?

1 个答案:

答案 0 :(得分:1)

使用多个级别的引用可能会引入错误,因此最好避免。

看来qsub期望脚本文件名或可执行程序后跟参数。但是,两种情况下的语法不同。参见:Submitting Job Directly by Specifying Executable on Command Line

qsub scriptfile

qsub -- program arg1 arg2 arg3 ...

因此,最简单的解决方案似乎不是嵌套引号而是在--前面加上

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

对于更长的命令行,将脚本另存为文件可能更好,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}"