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과 같은 프로그램은 이를 다르게 처리하는 것 같습니다. Ed Morton은 s/\r$//자신의 의견을 바탕으로 sed ''가 일반적으로 더 나은 솔루션이라고 제안했습니다.

tr '\r' '\n' 은 입력의 모든 \rs를 \ns로 변환하지만 \rs가 입력의 다른 곳에 나타나는 것은 완벽하게 유효하며, 그렇다면 tr은 입력 행을 분리합니다. 줄 끝에 있는 원치 않는 \rs에 대한 올바른 해결책은 단순히 예를 들어 sed 's/\r$//'를 사용하여 줄 끝에 있는 \rs를 제거하는 것입니다.

관련 정보