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를 제거하는 것입니다.