次の出力を含むテキストファイルがあります。
file_0108.json
2023-02-22T01:15:05.531+0000 connected to: mongodb://[**REDACTED**]@localhost
2023-02-22T01:15:08.531+0000 [######..................] db.coll 64.7MB/255MB (25.4%)
2023-02-22T01:15:11.531+0000 [############............] db.coll 128MB/255MB (50.3%)
2023-02-22T01:15:14.531+0000 [##################......] db.coll 196MB/255MB (76.9%)
2023-02-22T01:15:17.286+0000 [########################] db.coll 255MB/255MB (100.0%)
2023-02-22T01:15:17.286+0000 380757 document(s) imported successfully. 0 document(s) failed to import.
ファイル番号(0000 - 1000のブロック開始)すべてのファイルが正常にインポートされたわけではありません。ファイル名で始まり、次に終わるすべてのテキストブロックを見つける方法は?
xxxxx document(s) imported successfully. 0 document(s) failed to import
それでは、削除してエラーだけを残しておきますか?
各チャンクは、ファイル名とチャンクの終わりの間に異なる行数を持つことができます。
一部のブロックにはエラーがありますが、エラーが異なる可能性があるため、エラーなしでブロックを削除する方が簡単になると思います。
エラーブロックの例:
file_0293.json
2023-02-22T01:52:15.303+0000 connected to: mongodb://[**REDACTED**]@localhost
2023-02-22T01:52:16.836+0000 Failed: error processing document #46401: invalid character ',' after object key
2023-02-22T01:52:16.836+0000 46000 document(s) imported successfully. 0 document(s) failed to import.
ベストアンサー1
もしあれば各ブロック内に空白行はありません。テキストを入力してsed
各行の後に空白行を挿入し、imported successfully
ファイルを「段落」(1つ以上の空白行で区切られたテキストブロック)として扱うことができます。たとえば、
sed -e $'/imported successfully/a\\\n' filename |
perl -00 -n -e 'print if /Failed:/'
for
また、あなたのコメントでbashループを実行して入力ファイルが生成されると述べましたecho <filename> && mongoimport
。echo <filename> && mongoimport ; echo
今後の実行では、出力がすでに段落に分割されるように実行に変更することをお勧めします。sed
改行文字を挿入する必要はなくなり、次のように実行できます。
perl -00 -n -e 'print if /Failed:/' filename