^H および ^M 文字を使用して大容量ファイルを評価します。

^H および ^M 文字を使用して大容量ファイルを評価します。

ログファイルを生成するプロセスはテキストベースの進行状況バーを更新する^Hため、多くの文字を含むログファイルがあります。^M

使用すると、cat出力が評価され、人間が読むことができ、簡潔に表示されます。以下はサンプル出力です。

Epoch 11/120
4355/4355 [==============================] - ETA: 0s - loss: 0.0096   
Epoch 00011: val_loss did not improve from 0.00992
4355/4355 [==============================] - 1220s 280ms/step - loss: 0.0096 - val_loss: 0.0100

catただし、上記の実際の印刷テキストと比較して、ファイル自体のサイズが大きくなります(約900行、70 MB)。

以下は、ログファイルに含まれる実際のテキストの一部です。

1/Unknown - 0s 81us/step - loss: 0.5337^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M  2/Unknown - 1s 438ms/step - loss: 0.5299^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^
H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M      3/Unknown - 1s 386ms/step - loss: 0.5286^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M      4/Unknown - 1s 357ms/step - loss: 0.5289^H^H^H^H^H^H^H^H^H^
H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M      5/Unknown - 2s 339ms/step - loss: 0.5277^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M      6/Unknown - 2s 327ms/
step - loss: 0.5258^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M      7/Unknown - 2s 318ms/step - loss: 0.5250^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^
H^H^H^H^H^M      8/Unknown - 2s 312ms/step - loss: 0.5260^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M      9/Unknown - 3s 307ms/step - loss: 0.5265^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^
H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M     10/Unknown - 3s 303ms/step - loss: 0.5257^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M     11/Unknown - 3s 299ms/step - loss: 0.5258^H^H^H^

cat基本的に作成されたファイルと同じように見えるファイルを作成したいと思います。

私が試したがほとんど成功しなかったいくつかの方法は次のとおりです。

  • tr -d '\b\r' < logfile > new_fileすべての文字を削除しても不要なテキストはすべて残します。
  • cat logfile > new_file実際に特殊文字を評価せずにファイルをそのままコピーするだけです。
  • cat logfile | col -b > new_fileほぼ似ていますが、繰り返し行の1つで奇妙なことが起こります。
4355/4355 [==============================] - ETA: 0ss--loss::0.0096557
Epoch 00011: val_loss did not improve from 0.00992
4355/4355 [==============================] - 1220s 280ms/step - loss: 0.0096 - val_loss: 0.0100

どんな助けでも大変感謝します。

ありがとう

ベストアンサー1

明確にするために、これを回答として投稿してください。

〜のようにローイングこの場合、コマンドはawk -F '\r' '{print $NF}' file期待どおりに機能し、最後のキャリッジリターン以降のすべてのエントリを削除することを指摘してください。たとえこれは頑丈ではありませんが、ジェブジェク指摘した。

以下にC++でより強力なソリューションを作成しました。

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

string filter_string(string line, const char *bspace, const char *creturn){

    string new_str;

    for(string::size_type i = 0; i < line.size(); ++i) {
        // Step back if current string not empty
        if (line[i] == *bspace){
            if (new_str.size() != 0){
                new_str.pop_back();
            };
        // Reset on carriage return
        } else if (line[i] == *creturn){
            new_str = "";
        } else {
            new_str += line[i];
        };
    }

    return new_str;
};

int main(int argc, char* argv[]){
    const char backspace = '\x08';
    const char creturn = '\r';

    if (argc != 2){
        cerr << "USAGE: " << argv[0] << " [src]" << endl;
        return 1;
    }

    // Filter lines in file
    string line;
    ifstream infile(argv[1]);
    while (getline(infile, line)){
        cout << filter_string(line, &backspace, &creturn) << endl;
    };

    return 0;
};

これは各行の各文字を繰り返し、^Haがある場合は文字列が1ビット後に押され(空でない場合)、キャリッジリターンがある場合は文字列がリセット^Mされます。出力はに転送されたstdout後にファイルにパイプすることができます。

おすすめ記事