저는 cygwin을 사용하여 RAM(512M)이 제한된 소형 가상 머신에 연결하고 있습니다.
또한 4GB csv 파일에서 sqlite3 데이터베이스로 가져오려고 하는데 2행(총 8.717.201행)을 제외하고는 가져오기에 대한 단서가 없습니다.
라인 2에 control-m 문자(^M)가 있는 것 같아서 csv 형식이 깨지고 가져오기에 실패합니다.
control-m char을 사용하려고 하면 sed 's|,^M|,|' file.csv
텍스트 ASCII(2자)가 작성되므로 대체 항목을 검색하지 않습니다.
이 작업을 수행하기 위해 테스트 파일을 사용하고 검색 및 바꾸기를 위해 열면 vi
코드로 작성된 것을 볼 수 있습니다(파란색 ^M 및 단일 문자로 작동함).
CSV 파일을 복구하는 방법? (또는 cygwin에서 control-m 시퀀스를 어떻게 다시 작성합니까?
문제가 있는 줄의 예:
$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3^M$
,keyword4$
keyword5,keyword1,keyword2$
어떻게되어야합니까 :
$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3,keyword4$
keyword5,keyword1,keyword2$
PS: 보시다시피 영어는 제 모국어가 아니어서.. 실수해서 죄송해요 ́_(ツ)_/̱
답변1
실제로 캐리지 리턴은 잘못된 개행을 식별하는 데 도움이 될 수 있습니다.
s '/^M$/{N;s/^M\n//;}' test
Steeldriver가 쓴 것처럼 ^M
일반적 ctrlV으로 ctrlM.
명령의 의미
/^M$/{...}
: 줄 끝에 페이지 나누기가 있는 줄에서 중괄호로 묶인 명령을 실행합니다.N
ext는 버퍼에 다음 줄을 추가하고 줄 사이에 개행 문자를 삽입합니다.s/^M\n//
s
캐리지 리턴 + 개행 문자를 아무것도 없는 것으로 대체(개행 문자 제거)
이 간단한 스크립트는 행이 최대 한 번 중단된다고 가정합니다. 그렇지 않으면 다음과 같은 것이 필요합니다.
sed 'H;1h;$!d;x;s/^M\n//g' file
답변2
교체를 위해 sed 또는 vi에서 개행(또는 Enter) 표현을 얻는 한 가지 방법 ^M
은 다음을 입력하는 것입니다.
ctrlV enter