【问题标题】:Piping two bash commands in R: broken pipe error在 R 中管道两个 bash 命令:损坏的管道错误
【发布时间】:2012-07-12 08:23:04
【问题描述】:

我正在尝试在 R 中通过管道传输两个 bash 命令,但出现管道损坏错误;任何建议表示赞赏。 我在这里:

#Create a long file (2GB on your drive...)
write.csv(rep(1,1E8),file="long.txt", row.names=FALSE)

system("grep 1 tmp.txt")    #This works
system("grep 1 tmp.txt| head -n 10")    #This gives a broken pipe error

我得到 grep: 写入输出: 损坏的管道 使用短文件它可以正常工作。 请问我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 当你在命令行上做同样的事情时,你是否得到了破管错误?

标签: r bash pipe


【解决方案1】:

grep 抱怨,因为它的输出超过 10 行,而head 在完成之前将其切断。

我建议隐藏 grep 的 stderr 输出(这是打印损坏管道错误的地方)。

system("grep 1 tmp.txt 2>/dev/null | head -n 10")

如果您需要从 grep 中查看其他错误,这将不起作用;在这种情况下,您将需要一个更复杂的解决方案。

【讨论】:

  • 谢谢,这很有用(当我有足够的分数时会投票给你!)但是非常慢:该命令需要超过一分钟才能运行,而它在 bash 中是瞬时的......
  • 我不熟悉 R,但我看不出有任何理由说明如果您在两个地方运行完全相同的命令,它会变得更慢。它可能无济于事,但您也可以尝试:system("bash -c 'grep 1 tmp.txt 2>/dev/null | head -n 10'") 这将强制 system 使用 bash(以防它使用其他东西)。
  • 头部不应该发送 SIGPIPE 而不是退出?
  • 我不确定我是否理解:抛出了一个错误,但似乎是 grep,而不是 head
  • 其实@mrb 回到你的第一点:为什么这适用于小文件?在某些情况下,您的台词可能比头部关心的要多。
【解决方案2】:

或者,如果您的grep 实现支持它,您可以使用

grep -m 10 PATTERN FILE

部分描述来自:man grep on Ubuntu 12.04

-m NUM, --max-count=NUM
      Stop reading a file after NUM matching lines.

这个选项在我遇到类似问题的 Red Hat 5.8 机器上也可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 2012-12-21
    • 2014-04-28
    • 2011-02-12
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多