.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

hexdump를 살펴보면 다음과 같이 문제가 해결될 것 같습니다.

tr -d '\015' < input > log

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

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

관련 정보