The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Поиск и выкусывание нужного текста из файла, !*! agalin, 18-Мрт-08, 17:26  [смотреть все]
Помогите реализовать с помощью awk & sed или Perl.
Есть текстовый файл с содержимым такого вида:

        .......
abba babba affa aggga assa
BMW    mercedes benz.car germany
BMW    zma rexton.zma russia
tadda galla dalla malla
       ........

В этом файле между словами BMW и mercedes несколько пробелов, а между словами mercedes и benz стоит одинарный пробел, а между car и germany - несколлько пробелов. Нужно вытащить из этого файла и поместить в другой файл записи типа "mercedes benz", отыскав эту строчку по начальному полю "BMW" и комбинации ".car".
Помогите пожалуйста это сделать. Трудность вызывает то, что mercedes benz содержит пробел между словами, а так же то что нужно избавиться от .car.
Заранее спасибо!

  • Поиск и выкусывание нужного текста из файла, !*! agalin, 17:33 , 18-Мрт-08 (1)
    Известно, что интересующая нас запись стоит сразу же после BMW, но заранее не известно, состоит она из одного слова (mercedes) или из двух разделенных пробелом (mercede benz). Нужно вытащить то, что лежит между BMW и .car.
  • Поиск и выкусывание нужного текста из файла, !*! angra, 17:43 , 18-Мрт-08 (2)
    >отыскав эту строчку по начальному полю "BMW" и комбинации ".car".

    perl -ne 'print "$1\n" if /^BMW\s+(.*?)\.car/'

    Лучше конечно прочитать man perlre для понимания. Но все же прокоментирую
    ^ - начало строки
    BMW - дословно
    \s+ - один и больше пробельных символов
    (.*?) - _нежадный_ захват всего подряд
    \.car - .car
    Разница между жадным и нежадным захватом:
    $ perl -ne 'print "$1\n" if /^BMW\s+(.*?)\.car/'
    BMW    mercedes benz.car benz.car germany
    mercedes benz
    $ perl -ne 'print "$1\n" if /^BMW\s+(.*)\.car/'
    BMW    mercedes benz.car benz.car germany
    mercedes benz.car benz

    • Поиск и выкусывание нужного текста из файла, !*! agalin, 19:01 , 18-Мрт-08 (3)
      Спасибо за быстрый ответ!
      Пытаюсь реализовать с помощью sed:
      sed -ne '/^BMW\s+(.*?)\.car/p' test.txt    не ищет. В чем проблема?
    • Поиск и выкусывание нужного текста из файла, !*! agalin, 11:56 , 19-Мрт-08 (6)
      >perl -ne 'print "$1\n" if /^BMW\s+(.*?)\.car/'

      Спасибо! Работает!
      Есть еще один вопрос. Пусть есть файл вида:

                                   ..................................

      Name                    Interval     Datum Name     Ellipsoid Name     Semi-major axis
      __________________________________________________________________________________________________________
      Aurora Secondary        10 min       WGW-84         WGW-84             6378137.0000    

      Name                    Inv. flattening  Shift             Shift Type        Projection    
      __________________________________________________________________________________________________________
      Aurora Secondary        298.2572221      WGW-84 -> HDA-90  Bursa Wolf        ZONE 52S          
                                  
                                  ...................................

      Как например искать Shift Type, а выводить то, что написано под Shift Type - Bursa Wolf?
      Слово Bursa Wolf содержит пробел между словами. Данные, которые требуется вытаскивать, ищутся по заголовку (например Shift Type), а берется то, что располагается точно снизу - Bursa Wolf. Слова могут состоят из пробелов. Как это сделать?

      • Поиск и выкусывание нужного текста из файла, !*! agalin, 12:14 , 19-Мрт-08 (9)
        К сожалению все сместилось - не удалось показать файл. Попробую еще раз:

        Datum Name     Ellipsoid Name
        WGW-84           WGW-84

        Shift            Shift Type
        HDA-90     Bursa Wolf

        • Поиск и выкусывание нужного текста из файла, !*! phpcoder, 12:15 , 19-Мрт-08 (10)
          >Datum Name     Ellipsoid Name
          >WGW-84           WGW-84
          >
          >Shift            >Shift Type
          >HDA-90     Bursa Wolf

          Сколько строк? 5?

        • Поиск и выкусывание нужного текста из файла, !*! Arpo, 12:18 , 19-Мрт-08 (11)
          >К сожалению все сместилось - не удалось показать файл. Попробую еще раз:
          >
          >
          >Datum Name     Ellipsoid Name
          >WGW-84           WGW-84
          >
          >
          >Shift            
          >Shift Type
          >HDA-90     Bursa Wolf

          Разделитель полей TAB или пробел??

          • Поиск и выкусывание нужного текста из файла, !*! agalin, 12:43 , 19-Мрт-08 (13)
            >Разделитель полей TAB или пробел??

            Разделитель полей - множественные пробелы. Количество строк в файле заранее не известною Здесь приведен лишь фрагмент файла.
            Существенная деталь:
            Bursa Wolf располагается точно под Shift Type (то есть буква B под буквой S), WGW-84 располагается точно под Ellipsoid Name (то есть буква W под буквой E).  
            Ellipsoid Name и Shift Type не являются последними столбцами - столбцы есть и справа.
            Между строками WGW-84 и Shift расстояние -  2 пустые строки

                   .................
            Datum Name     Ellipsoid Name     ....
            WGW-84           WGW-84


            Shift            Shift Type       ....  
            HDA-90     Bursa Wolf
                 ...................

      • Поиск и выкусывание нужного текста из файла, !*! phpcoder, 12:34 , 19-Мрт-08 (12)
        [c0der@xxx ~]$ cat TEST
        Name                    Interval     Datum Name     Ellipsoid Name
        Semi-major axis
        __________________________________________________________________________________________________________
        Aurora Secondary        10 min       WGW-84         WGW-84
        6378137.0000

        Name                    Inv. flattening  Shift             ShiftType        Projection
        __________________________________________________________________________________________________________
        Aurora Secondary        298.2572221      WGW-84 -> HDA-90  Bursa Wolf       ZONE 52S
        [c0der@xx ~]$ sed -n '/ShiftType/{n;n;s/[ t]\{2,\}/|/g;s/[^|]*|[^|]*|[^|]*|\([^|]*\)|.*/\1/p}' <TEST
        Bursa Wolf

        Форматирование, возможно, всё испортит... Короче, надо вас сами пробовать. Вот дока по sed: http://www.cs.utk.edu/~vose/c-stuff/sed_tutorial.html Читайте, пробуйте и у вас всё получится.

        Вот алгоритм решения вашей задачи на sed:
        - найти строку, в которой есть фраза ShiftType (/ShiftType/)
        - считать следующую строку (n)
        - считать следующую строку (n)
        - теперь строка через одну от найденной у нас. Нужно "выкусить из неё 4 столбец
          + заменяем повторяющиеся два и более раз пробелы/табуляции во всей строке на что-то уникальное (s/[ \t]\{2,\}/|/g)
          + теперь наш уникальный знак является разделителем полей, по регэкспу выкусываем из него только четвёртое поле
        - выводим результат




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

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