ログファイルを生成するプロセスはテキストベースの進行状況バーを更新する^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;
};
これは各行の各文字を繰り返し、^H
aがある場合は文字列が1ビット後に押され(空でない場合)、キャリッジリターンがある場合は文字列がリセット^M
されます。出力はに転送されたstdout
後にファイルにパイプすることができます。
答え2
sed 's/.*\x0d//' logfile
要求どおりに行われるようです。
col -b
スペースを無視するため失敗します。
$ echo $'--------\r1st try\r2nd \r3rd\n' | col -b
3rd-try-