2017-02-07 8 views
-3

У меня огромный файл csv, около 500 Мб. Сепаратором поля является char char (|). Некоторые строки содержат символы новой строки и возврат каретки. Мне нужно удалить их, но я не хочу удалять законные строки перевода в конце каждой строки. Я попытался с sed и tr, как показано в других вопросах, но в итоге я удаляю все новые строки, чего я не хочу.В bash замените новую строку в файлах csv, за исключением случаев, когда на конец строки

Ввод пробы (|| Да линия должна быть присоединена к предыдущей строке):

21/06/2016 18:06:32|||||||||||||||||||32 Red|Jrup Vej 6|61069849 
||Yes||vals 
21/06/2016 18:06:32|||||||||||||||||||101 K|Ser Bevard 110|||No| 

Мои попытки:

sed -i 's/\r\n//g' myfile.csv 

tr -d '\r' < myfile.csv 

Спасибо за любую помощь, Джо

+3

Вы забыли предоставить образец ввода, ожидаемый результат и свои собственные усилия. – anubhava

+1

И как бы вы узнали, какой конец строки был «законным» или нет? Окончание строки - это конец строки. Если не существует какого-либо конкретного контекста, окружающего законные или незаконные окончания строки, невозможно сказать, какое окончание строки может быть законным или нет. –

+0

Очень сложно. Я бы сказал, что если новая строка превзойдена, и после нее следует какой-то текст и трубка, это новая строка, от которой мне нужно избавиться. – user1030520

ответ

1

A Данные csv обычно имеют фиксированное количество столбцов.

В вашем случае, кажется, полная запись содержит 25 столбцов. Исходя из этого, вы можете использовать эту команду awk для присоединения к неработающим файлам:

awk -F '|' 'NF < 25 {getline s; $0 = $0 s} 1' file 

21/06/2016 18:06:32|||||||||||||||||||32 Red|Jrup Vej 6|61069849||Yes||vals 
21/06/2016 18:06:32|||||||||||||||||||101 K|Ser Bevard 110|||No| 
+1

Спасибо @anubhava, это делает трюк красиво! – user1030520