Unix Shell CRLF será substituído por espaço

Unix Shell CRLF será substituído por espaço

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 perlopção -ide 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

informação relacionada