큰 CSV 파일이 있습니다. 필드 중 하나에 오류가 있습니다. 이 오류는 파일에 새 줄로 나타납니다.
지금부터 저는 Notepad++와 다음 명령을 사용하여 문제를 해결했습니다.
\r";" =>";"
sed로 동일한 작업을 어떻게 수행할 수 있나요?
난 이미 시도했어
sed -i 's/\r";"/";"/g' /path/file.csv
sed -i 's/^";"/";"/g' /path/file.csv
성공하지 못했습니다. 여기 누군가가 올바른 명령을 알고 있을 수도 있습니다.
답변1
sed가 한 줄씩 작동한다는 것을 이해하는 것이 중요합니다. sed가 하는 일은 기본적으로 버퍼에 라인을 읽는 것입니다.개행 문자 없음, 버퍼에서 명령 실행, 버퍼 인쇄(flag 를 지정하지 않은 것으로 가정 -n
), 다음 줄을 버퍼로 읽는 등의 작업을 수행합니다. 따라서 sed를 사용하여 두 줄을 병합하려면 sed가 한 번에 여러 줄을 처리하도록 명시적으로 강제해야 합니다. 이를 수행하려면 N
, P
및 D
명령을 사용하십시오.
이제 특정 질문에 대해 구체적이고 테스트된 답변을 제공하려면 특정 유형의 입력을 입력해야 하지만 다음은 수행할 수 있는 작업에 대한 몇 가지 예입니다.
그러면 두 행이 모두 병합됩니다.
sed $'N;s/[\\n\r]//g'
또는 항상 \r\n 줄 끝이 있다고 확신하는 경우:
sed 'N;s/.\n//'
최상의 솔루션은 아니지만 문제를 이해하기 위한 보다 맞춤화된 접근 방식이지만 bash 또는 구문을 통해 C 이스케이프를 지원하는 다른 셸을 사용하는 한 다음 작업을 수행해야 합니다 $'str'
.
sed $':l;N;/\r\\n";"/{;s/\r\\n";"/";"/g;n;};bl'
또는 C 스타일 이스케이프 구문이 없고 \r\n 줄 끝이 있는 경우(협상 불가능):
sed ':l;N;/\n";"/{;s/.\n";"/";"/g;n;};bl'
이것이 하는 일은 기본적으로 버퍼( N
)에 다음 줄을 추가하고 원하는 문자열( /\r\\n";"/
)을 테스트하는 것입니다. 일치하는 항목이 없으면 스크립트는 반복됩니다( bl
--> 처음에 정의된 태그로 분기). :l
일치하는 항목이 발견되면 중괄호 사이에 있는 sed 스크립트를 실행합니다. ( )를 모두 ( ) 로 바꾸고 버퍼를 플러시한 \r\\n";"
후 다음 줄( )을 입력합니다.";"
s/\r\\n";"/";"/g
n
물론 파일이 크고 "오류"가 자주 발생하지 않는다면 장시간 실행되어 많은 메모리를 사용할 수 있습니다. 그렇다면 다른 알고리즘을 사용할 수 있지만 귀하의 질문을 올바르게 이해했는지 확인하기 위해 귀하가 직면한 상황에 대한 더 나은 예가 필요합니다.
또한 sed에 대해 더 자세히 알고 싶다면 적극 추천합니다.이 웹사이트배경색이 가장 좋지 않을 수도 있지만 제 생각에는 최고의 sed 튜토리얼입니다.
답변2
Perl 솔루션이 귀하에게 적합한 경우:
perl -pe 's/\r";"/";"/g' foo.csv >foo_r.csv
답변3
문자를 제거하려면 \r
명령 필터를 사용하는 것이 더 쉽습니다 tr
.
cat file.csv | tr -d '\r' >newfile.csv
또는 직접:
tr -d '\r' <file.csv >newfile.csv
man tr
당신의 친구입니다. 경고: tr
표준 입력에서 읽는 필터로 사용하기 위한 것이며 sed -i
.
답변4
해결해야 할 비슷한 문제가 있었지만 결국 @Fjor의 답변과 약간 다른 버전을 사용하게 되었습니다.
cat file.csv | tr -d '\n'
(Tr은 TRanslate이며 일반적으로 검색/바꾸기 명령이지만 -d를 사용하면 작은따옴표 검색 문자열이 모두 제거됩니다.)
담당자가 있다면 Fjor의 답변에 대한 의견으로 이것을 넣었습니다. 아, 어쨌든, 여기 있습니다.