Я использую следующие входные данные для Oracle SQL Loader. Файл, который я скачал как CSV из Service, теперь имеет 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"
Это объединяет последовательные строки, заканчивающиеся на CRLF ( \r$
или \r\n
), в одну длинную строку, затем удаляет все пары CRLF из этой строки и печатает ее.
Измененный ввод выводится на stdout, который можно перенаправить в другой файл. Или используйте perl
опцию , -i
чтобы изменить исходный файл на месте:
$ perl -i.bak -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
Это позволит сохранить оригинал как rgram.txt.bak
.
Я не фанат использования -i
, я бы лучше просто перенаправил stdout, например, в rgram.new
. Запись в stdout более универсальна (вы можете передать ее в другие программы или использовать ее в подстановке процессов или команд и т. д.), и меньше риск ошибки, которая испортит исходный файл.
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, но оставить только LF без предшествующей CR, поэтому:
perl -pe 's/\r\n//' < input.txt > output.txt
или:
gawk -v RS='\r\n' -v ORS= 1 < input.txt > output.txt