Oracle SQL Loader에 다음 입력을 사용하고 있습니다. 이제 서비스에서 다운로드한 CSV 파일에 CRLF가 있습니다.
나는 전에 시도했다
dos2unix
tr '\n' ',' < input.txt > output.txt
awk '{printf "%s\r\n", $0}' file
하지만 행운은 없습니다.
견본:
"ID","NAME","GROUP","Free Text [CR][LF]
[CR][LF]
[CR][LF]
[CR][LF]
"
"ID1","NAME1","GROUP1","Free Text1 [CR][LF]
"
원하는 출력:
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"
도움이 되는 코드나 명령어를 제안해주세요
미리 감사드립니다
답변1
$ perl -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"
\r$
이는 CRLF (또는 )로 끝나는 연속 행을 \r\n
하나의 긴 행으로 연결한 다음 행에서 모든 CRLF 쌍을 제거하고 인쇄합니다.
수정된 입력은 stdout으로 인쇄되며, 출력은 다른 파일로 리디렉션될 수 있습니다. 또는 해당 옵션을 사용하여 perl
원본 -i
파일을 수정합니다.
$ perl -i.bak -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
이것은 그대로 유지됩니다 rgram.txt.bak
.
나는 을 사용하는 것을 좋아하지 않습니다 -i
. 표준 출력을 예를 들어 로 리디렉션하고 싶습니다 rgram.new
. 표준 출력에 쓰는 것이 더 다양하며(다른 프로그램에 파이프할 수 있거나 프로세스 또는 명령 대체 등에 사용할 수 있음) 버그로 인해 원본 파일이 손상될 위험이 적습니다.
rgram.txt
질문에 설명된 샘플 데이터가 포함된 텍스트 파일입니다.
$ sed -n l rgram.txt
"ID","NAME","GROUP","Free Text\r$
\r$
\r$
\r$
"$
"ID1","NAME1","GROUP1","Free Text1\r$
"$
답변2
sed 's/"$//' rgram.csv | sed 's/$/"/' | sed '/^"$/d' > rgram.new.csv
먼저 파일에서 마지막 " 문자를 제거한 다음 다시 추가한 다음 "로 시작하는 줄을 제거했습니다.
답변3
CRLF 시퀀스를 제거하고 싶지만 선행 CR 없이 LF만 유지하려는 경우가 있으므로 다음과 같이 하십시오.
perl -pe 's/\r\n//' < input.txt > output.txt
또는:
gawk -v RS='\r\n' -v ORS= 1 < input.txt > output.txt