-c:第0行:意外令牌附近的语法错误`(''

时间:2018-02-15 19:08:41

标签: python linux bash

我有一个PYTHON脚本,它接受一个输入文件并提供一个输出文件。输入文件和输出文件分为sys.argv [1]和[2],如下所示:

myscript.py input.file output.file

不幸的是,输入文件需要预处理以满足脚本的要求。我可以预处理原始文件并转换为可接受的格式。预处理步骤如下:

awk 'NR % 4 == 1 {print ">" $0 } NR % 4 == 2 {print $0}' filename.fastq > filename.fa

然而,有超过1000个这样的文件,为了节省一些存储空间,我希望脚本通过进程替换来获取预处理数据,我在这里找到了一个解决方案:https://superuser.com/questions/1070265/how-to-pipe-awk-command-output-to-python-as-first-argument

所以以下工作非常好:

myscript.py <(awk 'NR % 4 == 1 {print ">" $0 } NR % 4 == 2 {print $0}' input.fastq) output_processed.fa

然而,正如我所提到的,我有1000个这样的文件,我写了一个python脚本来遍历所有文件,然后在os.system中嵌套上面的命令,如下所示

os.system("myscript.py <(awk 'NR % 4 == 1 {print ">" $0 } NR % 4 == 2 {print $0}' input.fastq) output_processed.fa")

然而,这次我运行脚本时出现以下错误:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `myscript.py <(awk 'NR % 4 == 1 {print ">" $0 } NR % 4 == 2 {print $0}' input.fastq) output_processed.fa'

我可以发现同样的错误有很多答案,但它们都不适用于我。我有一些我试过的链接:

https://askubuntu.com/questions/348942/why-does-my-python-script-fail-with-syntax-errors

https://askubuntu.com/questions/656425/syntax-error-near-unexpected-token?rq=1

https://askubuntu.com/questions/656425/syntax-error-near-unexpected-token

https://askubuntu.com/questions/372926/bash-syntax-error-near-unexpected-token

当我使用上述解决方案时,我得到了EOL错误

我开始知道“(”这里的语法错误:bash: syntax error near unexpected token `('

然后我尝试用“/”然后我得到以下错误:

 IOError: [Errno 2] No such file or directory: '/<(awk NR % 4 == 1 {print ">" $0 } NR % 4 == 2 {print $0} input.fastq)

你能为我建议一个解决方案吗?

1 个答案:

答案 0 :(得分:1)

明确使用bash进行流程替换

os.system("bash -c \"myscript.py <(awk -v gt='>' 'NR % 4 == 1 {print gt $0 } NR % 4 == 2 {print $0}' input.fastq) output_processed.fa\"")

我将">"字符串从awk正文中删除,以减少嵌套引号的级别数。

或使用默认的/ bin / sh并将awk输出写入临时文件。

os.system("awk 'NR % 4 == 1 {print \">\" $0 } NR % 4 == 2 {print $0}' input.fastq > temp && myscript.py temp output_processed.fa; rm -f temp")

如果你控制myscript.py,允许它接受stdin上的数据而不是文件名,你可以写

os.system("awk '...' input.fastq | myscript.py output_processed.fa")