在Mac上运行MATLAB时烦人的cat / sed行为

时间:2013-01-26 21:42:43

标签: macos matlab sed

我正在运行一个脚本来解析可以由MATLAB调用或从命令行运行的文本电子邮件文件。脚本如下所示:

#!/bin/bash

MYSED=/opt/local/bin/gsed

"$MYSED" -n "/X-FileName/,/*/p" | "$MYSED" "/X-FileName/d" | "$MYSED" "/\-Original Message\-/q" 

如果我在终端窗口中运行cat message_file | ./parser.sh,我会得到一个已解析的文本文件。如果我在MATLAB中使用system命令执行相同的操作,我偶尔会得到相同的解析文本,然后是错误消息

cat: stdout: Broken pipe

当我使用sed命令而不是cat命令时,我收到了相同的错误消息。这可能发生在我正在解析的文件的1%上,几乎总是在Original Message行之后删除很多文件的大文件。当我不包含最后一个管道时,我没有收到错误,在“原始消息”之后删除所有管道。

如果可能的话,我想从cat中删除错误消息。理想情况下,我想了解为什么在终端中运行脚本时,通过MATLAB运行脚本会出错?由于它往往发生在较大的文件上,我猜它与内存限制有关,但“破管”是一个模糊的错误信息,我无法确定。任何关于这两个问题的提示都将非常感激。

我可以在MATLAB之外运行脚本并保存处理过的文件,但由于某些文件很大,我宁愿不再复制它们。

1 个答案:

答案 0 :(得分:1)

由于最终的gsed命令"$MYSED" "/\-Original Message\-/q",问题正在发生。一旦看到匹配,这显然就会退出,如果在它之后它会尝试写任何东西,它会收到SIGPIPE并退出,如果有足够的数据,那么第一个gsed会发生同样的事情,如果有的话将SIGPIPE发送到原始cat命令之后的足够数据,该命令报告错误。错误是否使其返回cat将取决于时间,缓冲,数据量,月相等等。

我的第一个建议是将"$MYSED" "/\-Original Message\-/q"命令放在管道的开头,让它从文件中读取(而不是从cat中提取)。这意味着更改脚本以接受要作为参数读取的文件:

#!/bin/bash

MYSED=/opt/local/bin/gsed

"$MYSED" "/\-Original Message\-/q" "$@" | "$MYSED" -n "/X-FileName/,/*/p" | "$MYSED" "/X-FileName/d"

...然后使用./parser.sh message_file运行它。如果我对消息文件格式的假设是正确的,那么以这种方式改变gsed命令的顺序不应该引起麻烦。是否有任何理由需要将消息文件传送到stdin而不是作为参数传递并直接读取?