The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"sed"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"sed"  +/
Сообщение от sh (??) on 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

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

Ответить | Правка | Cообщить модератору

Оглавление

  • sed, Andrey Mitrofanov, 22:07 , 09-Июл-13, (1)  
    • sed, sh, 16:36 , 10-Июл-13, (3)  
      • sed, sh, 16:43 , 10-Июл-13, (4)  
      • sed, sh, 16:58 , 10-Июл-13, (5)  
        • sed, Andrey Mitrofanov, 09:54 , 11-Июл-13, (6)  
          • sed, sh, 18:34 , 11-Июл-13, (7)  
            • sed, Andrey Mitrofanov, 22:11 , 11-Июл-13, (8)  
  • sed, John, 22:17 , 09-Июл-13, (2)  

Сообщения по теме [Сортировка по времени | RSS]


1. "sed"  +/
Сообщение от Andrey Mitrofanov on 09-Июл-13, 22:07 
> Подскажите правильное решение.

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

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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

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

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

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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "sed"  +/
Сообщение от sh (??) on 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.

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

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

а?

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

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

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

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

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

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

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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

2. "sed"  +/
Сообщение от John (??) on 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-файлы.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру