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