Замена символа новой строки в поле в файле csv

У меня есть CSV file со 165 столбцами, и у меня проблема. Мне нужно заменить символы \r\n пробелом в столбцах, но не в конце строки, так как это разделитель записей.

Вход:

001|Baker St.
London|3|4|7
002|Penny Lane
Liverpool|88|5|7

Выход:

001|Baker St. London|3|4|7
002|Penny Lane Liverpool|88|5|7

Я использую сценарий Windows, но я готов использовать UnxTools (gawk, sed, tr) или что-то еще, что нужно.


person digitaltangerine    schedule 04.06.2015    source источник
comment
Обратите внимание, что вы можете оставить отзыв в комментариях и, в конечном итоге, принять ответ. Вы можете сделать это, нажав на галочку рядом с ответом, чтобы переключить его с пустого на зеленый. См. Справочный центр › Вопросы, если у вас есть вопросы!   -  person fedorqui 'SO stop harming'    schedule 04.06.2015
comment
Извините за задержку. Прежде всего, спасибо за ответ, но я думаю, что не правильно объяснил. \r\n - это символы возврата каретки и новой строки, а не буквально \r\n.   -  person digitaltangerine    schedule 05.06.2015
comment
Хорошо, теперь я вижу: вы хотите соединить многострочные поля. Проверьте мой обновленный ответ.   -  person fedorqui 'SO stop harming'    schedule 05.06.2015
comment
Это работает как шарм с моим CSV на 165 полей. Благодарю вас!   -  person digitaltangerine    schedule 05.06.2015


Ответы (1)


Поэтому вам нужно сгруппировать многострочные поля. В этом случае давайте вручную сохраним строку, пока она не станет «достаточно большой», то есть пока в ней не будет достаточно полей, чтобы знать, что запись завершена:

awk -F"|" -v fields=5 '{f+=NF; str=(str?str OFS:"") $0}
                       f>=fields{print str; str=""; f=0}' file

С помощью -v fields=5 мы указываем, сколько полей должна содержать правильная строка. Затем мы продолжаем хранить данные в переменной str, пока в ней не будет хотя бы fields полей.

Обратите также внимание, что вы работаете с файлом Windows. Для правильной работы в UNIX сначала преобразуйте его в этот формат с помощью dos2unix file. Это преобразует \r\n в \n.

Тест

$ awk -F"|" -v fields=5 '{f+=NF; str=(str?str OFS:"") $0} f>=fields{print str; str=""; f=0}' file
001|Baker St. London|3|4|7
002|Penny Lane Liverpool|88|5|7

(Старая версия, когда казалось, что вам нужно удалить литерал \r\n)

Просто убедитесь, что что-то появляется после \r\n, чтобы конец строки не совпадал:

$ sed -r 's/\\r\\n(.)/ \1/g' file
001|Baker St. London|3|4|7\r\n
002|Penny Lane Liverpool|88|5|7\r\n

Это ищет \r\n плюс еще что-то и печатает это другое после пробела.

person fedorqui 'SO stop harming'    schedule 04.06.2015