0

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行の後に多くのファイルが削除される大きなファイルです。「元のメッセージ」の後のすべてを削除する最後のパイプを含めなくても、エラーは発生しません。

できれば猫からのエラーメッセージを抑えたいです。理想的には、MATLABを介してスクリプトを実行するとエラーが発生するのに、ターミナルで実行するとエラーが発生しない理由を理解したいと思います。大きなファイルで発生する傾向があるので、メモリの制限に関係していると思いますが、「壊れたパイプ」は漠然としたエラーメッセージであり、確信が持てません。どちらの問題についてもヒントをいただければ幸いです。

おそらくMATLABの外部でスクリプトを実行し、処理されたファイルを保存することもできますが、一部のファイルは大きいため、現時点では複製したくないと思います。

4

1 に答える 1

1

この問題は、最後のgsedコマンドが原因で発生してい"$MYSED" "/\-Original Message\-/q"ます。これは(明らかに)一致するものを見つけるとすぐに終了し、gsedフィードがその後何かを書き込もうとすると、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にパイプする必要がある理由はありますか?

于 2013-01-26T22:33:24.630 に答える