URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9702
[ Назад ]

Исходное сообщение
"sed"

Отправлено sh , 09-Июл-13 21:17 

Привет,

Необходимо парсить csv-файлы, т.е. с помощью sed вывести определенные поля. В качестве разделителя выступает точка с запятой (;). Проблема возникает, когда в поле встречается знак ;. Такие поля взяты в двойные кавычки. Надо в таких полях ; заменять на другой знак, не являющийся метасимволом.

Например: aa;"bb ; cc";dd -> aa;"bb -- cc";dd

Пробую,например, заменить

echo "aa;\"bb ; cc\";dd" | sed -E '/".*"/  s/;/--/g'
на выходе aa--"bb -- cc"--dd

Подскажите правильное решение.


Содержание

Сообщения в этом обсуждении
"sed"
Отправлено Andrey Mitrofanov , 09-Июл-13 22:07 
> Подскажите правильное решение.

Про правильное не знаю, вот написанное быстро и работающее, вроде

|awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'

На sed-е можно, но муторно. Я пропускаю.


"sed"
Отправлено sh , 10-Июл-13 16:36 
>> Подскажите правильное решение.
> Про правильное не знаю, вот написанное быстро и работающее, вроде
> |awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
> На sed-е можно, но муторно. Я пропускаю.

О, то что надо. Че я сразу awk не применил. Не люблю его как-то... медленновато работает с большимм объемами данных.


"sed"
Отправлено sh , 10-Июл-13 16:43 
>>> Подскажите правильное решение.
>> Про правильное не знаю, вот написанное быстро и работающее, вроде
>> |awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
>> На sed-е можно, но муторно. Я пропускаю.
> О, то что надо. Че я сразу awk не применил. Не люблю
> его как-то... медленновато работает с большимм объемами данных.

Поторопился. Немного не то. Заведомо неизвестно в каком поле встречается знак (;), если только во-втором, тут да все просто :-)


"sed"
Отправлено sh , 10-Июл-13 16:58 
>>> Подскажите правильное решение.
>> Про правильное не знаю, вот написанное быстро и работающее, вроде
>> |awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
>> На sed-е можно, но муторно. Я пропускаю.

sorry for noise
Работает все гуд. Только не пойму смысл NR%2==0.


"sed"
Отправлено Andrey Mitrofanov , 11-Июл-13 09:54 
>>> Про правильное не знаю, вот написанное быстро и работающее, вроде
>>> |awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";","--")}{print}'
> Работает все гуд. Только не пойму смысл NR%2==0.

Ну, обясню я тебе, ты скажешь "здорово!", допустим, но ничему ж не научишься.

Отсюда вопрос, стоит ли у нас задача чему-нибудь научить того, кто спрашивает и других участников (в других вопросам - самим научиться), или же тут маркет халявных скрипт-арбайтеров?

И вопрос№2, является ли принуждение к миру^Wсамостоятельному, если не решению задачи, то хотя бы, _прочтению и пониманию предоставленного решения, методом этого самого обучения?

А давайте это обсудим?!!


"sed"
Отправлено sh , 11-Июл-13 18:34 
>[оверквотинг удален]
>> Работает все гуд. Только не пойму смысл NR%2==0.
> Ну, обясню я тебе, ты скажешь "здорово!", допустим, но ничему ж не
> научишься.
> Отсюда вопрос, стоит ли у нас задача чему-нибудь научить того, кто спрашивает
> и других участников (в других вопросам - самим научиться), или же
> тут маркет халявных скрипт-арбайтеров?
> И вопрос№2, является ли принуждение к миру^Wсамостоятельному, если не решению задачи,
> то хотя бы, _прочтению и пониманию предоставленного решения, методом этого самого
> обучения?
> А давайте это обсудим?!!

Давайте, и давайте не будем представляться умнее планеты всей :-)

Смысл NR%2==0 знаю и на инглише читать тоже умею к примеру вот отсюда http://www.gnu.org/software/gawk/manual/html_node/Very-Simpl...

Немного непонятно поведение awk касательно моего случая с установленным NR%2==0.

И да, разве этот мой пост не является опровержением ваших рассуждений:

> Отсюда вопрос, стоит ли у нас задача чему-нибудь научить того, кто спрашивает
> и других участников (в других вопросам - самим научиться), или же
> тут маркет халявных скрипт-арбайтеров?

а?


"sed"
Отправлено Andrey Mitrofanov , 11-Июл-13 22:11 
> Давайте, и давайте не будем представляться умнее планеты всей :-)
> Смысл NR%2==0 знаю
> Немного непонятно поведение awk касательно моего случая

Обрати очи в сторону >>-v RS=\" -v ORS=\"<<.

> И да, разве этот мой пост не является опровержением ваших рассуждений:

Не-а. Я тебе рассказал "страшный секрет" второй половины заклинания. Теперь ты напряжёшься, прочитаешь-таки, как там и что, и через пару дней забудешь всё.

>> Отсюда вопрос, стоит ли у нас задача чему-нибудь научить того, кто спрашивает
> а?

Понял, что нет.


"sed"
Отправлено John , 09-Июл-13 22:17 
> Привет,
> Необходимо парсить 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-файлы.