Привет,Необходимо парсить csv-файлы, т.е. с помощью sed вывести определенные поля. В качестве разделителя выступает точка с запятой (;). Проблема возникает, когда в поле встречается знак ;. Такие поля взяты в двойные кавычки. Надо в таких полях ; заменять на другой знак, не являющийся метасимволом.
Например: aa;"bb ; cc";dd -> aa;"bb -- cc";dd
Пробую,например, заменить
echo "aa;\"bb ; cc\";dd" | sed -E '/".*"/ s/;/--/g'
на выходе aa--"bb -- cc"--ddПодскажите правильное решение.
> Подскажите правильное решение.Про правильное не знаю, вот написанное быстро и работающее, вроде
|awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
На sed-е можно, но муторно. Я пропускаю.
>> Подскажите правильное решение.
> Про правильное не знаю, вот написанное быстро и работающее, вроде
> |awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
> На sed-е можно, но муторно. Я пропускаю.О, то что надо. Че я сразу awk не применил. Не люблю его как-то... медленновато работает с большимм объемами данных.
>>> Подскажите правильное решение.
>> Про правильное не знаю, вот написанное быстро и работающее, вроде
>> |awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
>> На sed-е можно, но муторно. Я пропускаю.
> О, то что надо. Че я сразу awk не применил. Не люблю
> его как-то... медленновато работает с большимм объемами данных.Поторопился. Немного не то. Заведомо неизвестно в каком поле встречается знак (;), если только во-втором, тут да все просто :-)
>>> Подскажите правильное решение.
>> Про правильное не знаю, вот написанное быстро и работающее, вроде
>> |awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
>> На sed-е можно, но муторно. Я пропускаю.sorry for noise
Работает все гуд. Только не пойму смысл NR%2==0.
>>> Про правильное не знаю, вот написанное быстро и работающее, вроде
>>> |awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
> Работает все гуд. Только не пойму смысл NR%2==0.Ну, обясню я тебе, ты скажешь "здорово!", допустим, но ничему ж не научишься.
Отсюда вопрос, стоит ли у нас задача чему-нибудь научить того, кто спрашивает и других участников (в других вопросам - самим научиться), или же тут маркет халявных скрипт-арбайтеров?
И вопрос№2, является ли принуждение к миру^Wсамостоятельному, если не решению задачи, то хотя бы, _прочтению и пониманию предоставленного решения, методом этого самого обучения?
А давайте это обсудим?!!
>[оверквотинг удален]
>> Работает все гуд. Только не пойму смысл NR%2==0.
> Ну, обясню я тебе, ты скажешь "здорово!", допустим, но ничему ж не
> научишься.
> Отсюда вопрос, стоит ли у нас задача чему-нибудь научить того, кто спрашивает
> и других участников (в других вопросам - самим научиться), или же
> тут маркет халявных скрипт-арбайтеров?
> И вопрос№2, является ли принуждение к миру^Wсамостоятельному, если не решению задачи,
> то хотя бы, _прочтению и пониманию предоставленного решения, методом этого самого
> обучения?
> А давайте это обсудим?!!Давайте, и давайте не будем представляться умнее планеты всей :-)
Смысл NR%2==0 знаю и на инглише читать тоже умею к примеру вот отсюда http://www.gnu.org/software/gawk/manual/html_node/Very-Simpl...
Немного непонятно поведение awk касательно моего случая с установленным NR%2==0.
И да, разве этот мой пост не является опровержением ваших рассуждений:
> Отсюда вопрос, стоит ли у нас задача чему-нибудь научить того, кто спрашивает
> и других участников (в других вопросам - самим научиться), или же
> тут маркет халявных скрипт-арбайтеров?а?
> Давайте, и давайте не будем представляться умнее планеты всей :-)
> Смысл NR%2==0 знаю
> Немного непонятно поведение awk касательно моего случаяОбрати очи в сторону >>-v RS=\" -v ORS=\"<<.
> И да, разве этот мой пост не является опровержением ваших рассуждений:
Не-а. Я тебе рассказал "страшный секрет" второй половины заклинания. Теперь ты напряжёшься, прочитаешь-таки, как там и что, и через пару дней забудешь всё.
>> Отсюда вопрос, стоит ли у нас задача чему-нибудь научить того, кто спрашивает
> а?Понял, что нет.
> Привет,
> Необходимо парсить csv-файлы, т.е. с помощью sed вывести определенные поля. В качестве
> разделителя выступает точка с запятой (;). Проблема возникает, когда в поле
> встречается знак ;. Такие поля взяты в двойные кавычки. Надо в
> таких полях ; заменять на другой знак, не являющийся метасимволом.
> Например: aa;"bb ; cc";dd -> aa;"bb -- cc";dd
> Пробую,например, заменить
> echo "aa;\"bb ; cc\";dd" | sed -E '/".*"/ s/;/--/g'
> на выходе aa--"bb -- cc"--dd
> Подскажите правильное решение.А еще поле может содержать двойные кавычки как значение(а может и не один символ, а несколько).
IMHO: CSV - штука совсем не простая. Я бы использовал Perl. На http://search.cpan.org/ в изобилии модулей, _корректно_ обрабатывающих CSV-файлы.