^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줄, 70MB).

다음은 로그 파일에 포함된 실제 텍스트의 일부입니다.

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거의 비슷하지만 반복되는 줄 중 하나에서 이상한 일이 발생합니다.
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후 파일로 파이프될 수 있습니다.

답변2

sed 's/.*\x0d//' logfile

요청한 대로 수행되는 것 같습니다.

col -b공백을 무시하기 때문에 실패합니다 .

$ echo $'--------\r1st try\r2nd   \r3rd\n' | col -b
3rd-try-

관련 정보