grep 画面出力がファイル出力と異なります。

grep 画面出力がファイル出力と異なります。

grep(およびsed)を使用すると、出力をファイルに送信したときと端末で異なる結果が得られます。私のスタートアップファイルはdarknet Yolo mAPの実行からキャプチャした出力です。

     CUDNN_HALF=1 
net.optimized_memory = 0 
mini_batch = 1, batch = 32, time_steps = 1, train = 0 
Create CUDA-stream - 0 
 Create cudnn-handle 0 
nms_kind: greedynms (1), beta = 0.600000 
nms_kind: greedynms (1), beta = 0.600000 
nms_kind: greedynms (1), beta = 0.600000 

 seen 64, trained: 96 K-images (1 Kilo-batches_64) 

 calculation mAP (mean average precision)...
 Detection layer: 139 - type = 28 
 Detection layer: 150 - type = 28 
 Detection layer: 161 - type = 28 

 detections_count = 3688, unique_truth_count = 2114  
 rank = 0 of ranks = 3688 
 rank = 100 of ranks = 3688 
 rank = 200 of ranks = 3688 
.
.
.
 rank = 3400 of ranks = 3688 
 rank = 3500 of ranks = 3688 
 rank = 3600 of ranks = 3688 
class_id = 0, name = car, ap = 87.89%        (TP = 1414, FP = 130) 
class_id = 1, name = motorcycle, ap = 90.91%     (TP = 10, FP = 0) 
class_id = 2, name = truck, ap = 96.37%      (TP = 270, FP = 33) 
class_id = 3, name = gcp, ap = 96.08%        (TP = 305, FP = 13) 

 for conf_thresh = 0.25, precision = 0.92, recall = 0.95, F1-score = 0.93 
 for conf_thresh = 0.25, TP = 1999, FP = 176, FN = 115, average IoU = 83.92 % 

 IoU threshold = 75 %, used Area-Under-Curve for each unique Recall 
 mean average precision ([email protected]) = 0.902287, or 90.23 % 

Set -points flag:
 `-points 101` for MS COCO 
 `-points 11` for PascalVOC 2007 (uncomment `difficult` in voc.data) 
 `-points 0` (AUC) for ImageNet, PascalVOC 2010-2012, your custom dataset

複数の配列を試しましたが、class_id結果行を抽出しようとすると、同じ結果が得られます。

grep class_id results.txt > class_results.txt

これにより、ファイルに次のテキストが生成されます。

 rank = 0 of ranks = 3688 
 rank = 100 of ranks = 3688 
 rank = 200 of ranks = 3688 
.
.
.
 rank = 3400 of ranks = 3688 
 rank = 3500 of ranks = 3688 
 rank = 3600 of ranks = 3688 
class_id = 0, name = car, ap = 87.89%        (TP = 1414, FP = 130) 
class_id = 1, name = motorcycle, ap = 90.91%     (TP = 10, FP = 0) 
class_id = 2, name = truck, ap = 96.37%      (TP = 270, FP = 33) 
class_id = 3, name = gcp, ap = 96.08%        (TP = 305, FP = 13) 

その部分を無視すると、> class_results.txt出力は正しく表示されます(または期待どおり)。

class_id = 0, name = car, ap = 87.89%        (TP = 1414, FP = 130) 
class_id = 1, name = motorcycle, ap = 90.91%     (TP = 10, FP = 0) 
class_id = 2, name = truck, ap = 96.37%      (TP = 270, FP = 33) 
class_id = 3, name = gcp, ap = 96.08%        (TP = 305, FP = 13) 

私は「ランク」を含む行を削除するためにsedを使ってみました。つまり、sed '/rank/d' class_results.txt > class_results_concise.txt「ランク」を含む行だけでなく、クラスID = 0出力に行を保持したいです。私はsedのフォームの内部編集を試み、同じ結果を得ました。

class_idを含む行をテキストファイルに出力するには?

これはすべてUbuntu 20.04にあります。 stdoutなどについて何か誤解しているようです。あなたのソリューションに非常に感謝します。よろしくお願いします。


追加情報:ASCIIを確認した後、「rank」という単語を含む行の前にCR(ASCII 13)があり、class_idを含む行の前にLF(ASCII 10)があることがわかりました。 CRをLFに変換する方法が必要だと思いますか? ? ?

ベストアンサー1

trのヒントを提供してくれた@Paul_Pedantに感謝します。

grep を実行する前にファイルをパイピングするとtr '\r' '\n'問題が解決します。フィルタリングする出力テキストファイルの一部の場所にCRがあり、他の場所にLFがあるようです。 grepのようなプログラムはそれを別の方法で扱うようです。エド・モートン氏は、s/\r$//自分の意見に基づいて、sed ''が一般的に良い解決策であると提案しました.

tr '\r' '\n' は入力のすべての \rs を \ns に変換しますが、\rs が入力の他の場所に現れるのは完全に有効です。そうであれば tr は入力行を分離します。行末の不要な \rs に対する正しい解決策は、単に、例えば sed 's/\r$//' を使用して行末の \rs を削除することです。

おすすめ記事