.csv 파일에서 0d 캐리지 리턴 문자 제거

.csv 파일에서 0d 캐리지 리턴 문자 제거

스크립트를 사용할 때 이 문제가 발생했습니다. 대부분의 경우 스크립트를 실행할 때 다음과 같은 출력 파일이 표시됩니다.

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167224170, 148.000.000.30
 SEP0c1167231d2e, 148.000.000.194
 SEP0c1167233b9f, 148.000.000.31
 CUV, 148.000.000.254
 SEP0c1167231d32, 148.000.000.34
 SEP501cbffcfa9c, 148.000.000.24
 SEP00082fb67d5f, 148.000.000.21
 SEP00082fb67701, 148.000.000.22

이것이 바로 내가 예상한 것이지만 때로는 파일이 다음과 같이 보일 때도 있습니다.

device_id,ip_address,serial_number
 SEP0c1167231746
, 148.000.000.32
 SEP0c1167223fa5
, 148.000.000.30
 SEP0c1167224170
, 148.000.000.30
 SEP0c1167231d2e
, 148.000.000.194
 SEP0c1167233b9f
, 148.000.000.31
 CUV
, 148.000.000.254
 SEP0c1167231d32
, 148.000.000.34
 SEP501cbffcfa9c
, 148.000.000.24
 SEP00082fb67d5f
, 148.000.000.21
 SEP00082fb67701
, 148.000.000.22

무슨 일이 일어나고 있는지 알아내려고 노력하고 있지만 정상적이지 않은 것 같습니다. 이제 문제를 처리하고 싶습니다. Ghex를 사용하여 문제를 일으키는 문자를 식별했습니다.

여기에 이미지 설명을 입력하세요.

이제 모든 "0D"를 Null로 바꾸고 모든 "0A"를 유지하고 싶습니다.

참고로 "dos2unix"를 사용해 보았지만 작동하지 않았습니다.

도와주세요?

업데이트: 사용: sed -n -e '/,/!{N;s/\n//;} /,/p' 입력

다음과 같은 파일로:

device_id,ip_address,serial_number
 SEP0c1167231746
, 148.000.000.32
,
 SEP0c1167223fa5
, 148.000.000.30
,
 SEP0c1167224170
, 148.000.000.30
,
 SEP0c1167231d2e
, 148.000.000.194
,
 SEP0c1167233b9f
, 148.000.000.31
,
 CUV
, 148.000.000.254
,
 SEP0c1167231d32
, 148.000.000.34
,
 SEP501cbffcfa9c
, 148.000.000.24
,
 SEP00082fb67d5f
, 148.000.000.21
,
 SEP00082fb67701
, 148.000.000.22

나는 다음과 같은 결과를 얻었습니다.

, 148.000.000.32
, 148.000.000.30
, 148.000.000.30
, 148.000.000.194
, 148.000.000.31
, 148.000.000.254
, 148.000.000.34
, 148.000.000.24
, 148.000.000.21
, 148.000.000.22

답변1

아마도 더 나은 옵션이 있을 수 있지만 sed여기에 하나가 있습니다.

sed -n -e '/,/!{N;s/\n//;}; /,/p' input > output

(기본적으로 줄은 인쇄되지 않습니다): 줄에 쉼표가 있으면 다음을 읽어보세요.다음개행 문자를 래핑하고 교체합니다. 그런 다음 해당 줄(현재 또는 이미)에 쉼표가 있으면 해당 줄을 인쇄합니다. 에서 읽고 input씁니다 output. 일부 sed에서는 sed의 -i플래그를 사용하여 파일을 제자리에서 편집할 수 있습니다.

입력 예:

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167231746
, 148.000.000.32
 SEP0c1167223fa5
, 148.000.000.30

예제 출력:

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30

답변2

16진수 덤프를 보면 다음과 같이 문제가 해결될 것 같습니다.

tr -d '\015' < input > log

8진수는 문자 \015이기 때문입니다 .carriage return ^M

도움이 되지 않는 이유 dos2unix는 귀하의 사례에 존재하지 않는 시퀀스를 보기 때문입니다 dos2unix.\r\n

관련 정보