Estou usando a seguinte entrada para Oracle SQL Loader. O arquivo que baixei como CSV do Service agora tem um CRLF
Eu tentei o
dos2unix
tr '\n' ',' < input.txt > output.txt
awk '{printf "%s\r\n", $0}' file
mas sem sorte.
Dados de amostra :
"ID","NAME","GROUP","Free Text [CR][LF]
[CR][LF]
[CR][LF]
[CR][LF]
"
"ID1","NAME1","GROUP1","Free Text1 [CR][LF]
"
Saída desejada:
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"
Por favor, sugira um código ou comando que será útil
desde já, obrigado
Responder1
$ perl -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"
Isso une linhas sucessivas que terminam em CRLF ( \r$
ou \r\n
) em uma linha longa, depois retira todos os pares CRLF dessa linha e a imprime.
A entrada modificada é impressa em stdout, que pode ser redirecionado para outro arquivo. Ou use a perl
opção -i
de modificar o arquivo original no local:
$ perl -i.bak -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
Isso manterá o original como rgram.txt.bak
.
Não sou fã de usar -i
, prefiro apenas redirecionar o stdout para, por exemplo, rgram.new
. Escrever em stdout é mais versátil (você pode canalizá-lo para outros programas ou usá-lo na substituição de processos ou comandos, etc.) e há menos risco de um erro destruir o arquivo original.
rgram.txt
é um arquivo de texto contendo os dados de amostra conforme descrito na pergunta:
$ sed -n l rgram.txt
"ID","NAME","GROUP","Free Text\r$
\r$
\r$
\r$
"$
"ID1","NAME1","GROUP1","Free Text1\r$
"$
Responder2
sed 's/"$//' rgram.csv | sed 's/$/"/' | sed '/^"$/d' > rgram.new.csv
Eu removi o último caractere "do arquivo primeiro e depois adicionei-o novamente e removi a linha que começa com".
Responder3
Vejo que você deseja remover as sequências CRLF, mas deixar o LF sem preceder o CR sozinho, então:
perl -pe 's/\r\n//' < input.txt > output.txt
ou:
gawk -v RS='\r\n' -v ORS= 1 < input.txt > output.txt