The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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, 22:07 , 09-Июл-13 (1)
    > Подскажите правильное решение.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          • sed, !*! sh, 18:34 , 11-Июл-13 (7)
            >[оверквотинг удален]
            >> Работает все гуд. Только не пойму смысл 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, 22:11 , 11-Июл-13 (8)
              > Давайте, и давайте не будем представляться умнее планеты всей :-)
              > Смысл NR%2==0 знаю
              > Немного непонятно поведение awk касательно моего случая

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

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

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

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

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

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




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

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