【发布时间】:2021-10-28 04:03:33
【问题描述】:
我正在使用 system() 命令在 R 中运行 Bash 命令,但每次我尝试将一个命令的结果通过管道传递到下一个命令(使用“|”)时,都会出现一些错误。
例如:
system('grep ^SN bam_stats.txt | cut -f 2- | sed -n 8p | awk -F "\t" '{print $2}'') 返回错误:Error: unexpected '{' in "system('grep ^SN bam_stats.txt | cut -f 2- | sed -n 8p | awk -F "\t" '{",如果我尝试删除 awk -F "\t" '{print $2}' 以便留下 system('grep ^SN bam_stats.txt | cut -f 2- | sed -n 8p'),我会得到以下信息:
/usr/bin/grep: 2-: No such file or directory
[1] 2
我必须继续删除它的一部分,直到我只剩下system('grep ^SN bam_stats.txt'),也就是没有留下任何管道,它才能工作。
这是我从中提取信息的文件“bam_stats.txt”中的一个示例:
SN filtered sequences: 0
SN sequences: 137710356
SN is sorted: 1
SN 1st fragments: 68855178
SN last fragments: 68855178
SN reads mapped: 137642653
SN reads mapped and paired: 137602018 # paired-end technology bit set + both mates mapped
SN reads unmapped: 67703
SN percentage of properly paired reads (%): 99.8
谁能告诉我为什么管道不工作?抱歉,如果这是一个愚蠢的问题。如果我应该提供更多信息,请告诉我。
提前谢谢你。
【问题讨论】:
-
R 中的
system('echo hello | cat')是否在标准输出上发出hello或hello | cat?如果是前者,则管道受到尊重。 -
...stat.ethz.ch/R-manual/R-devel/library/base/html/system.html 确实明确记录了
system()应该在 UNIXy 系统上的 R 中使用/bin/sh,所以我们不需要担心 R 是否有一个名为 @987654336 的函数@ 这实际上并没有启动一个 shell。 -
现在,您的 original 错误更有意义 - 这是因为您试图将文字单引号放在单引号字符串中(所以为什么 awk 没有't work 是有道理的;如何在字符串中转义单引号是一个非常特定于语言的事情,你需要知道 R 的人来回答它)。
-
也就是说,
system()不使用 bash,它使用sh。这个问题应该标记为sh,而不是bash。它们是两个不同的 shell,虽然 bash 主要是 POSIX sh 的超集,但这并不意味着它们完全兼容。 -
@G5W,是的,我指出了这一点above。这个问题并不奇怪。另一方面,
system('grep ^SN bam_stats.txt | cut -f 2- | sed -n 8p')的失败令人惊讶。