- Поиск и выкусывание нужного текста из файла, 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 не ищет. В чем проблема?
- Поиск и выкусывание нужного текста из файла, rWizard, 22:14 , 18-Мрт-08 (4)
>Спасибо за быстрый ответ! >Пытаюсь реализовать с помощью sed: >sed -ne '/^BMW\s+(.*?)\.car/p' test.txt не ищет. В чем проблема? >Видимо в том, что sed использует другую билиотеку регулярных выражений - соответствующую стандарту IEEE Std 1003.2 man re_format Регулярные выражения perl имеют больший функционал.
- Поиск и выкусывание нужного текста из файла, stas, 00:29 , 19-Мрт-08 (5)
>Спасибо за быстрый ответ! >Пытаюсь реализовать с помощью sed: >sed -ne '/^BMW\s+(.*?)\.car/p' test.txt не ищет. В чем проблема? >sed -n 's/^BMW\s\+\(.*\)\.car.*/\1/p' test.txt
- Поиск и выкусывание нужного текста из файла, agalin, 12:00 , 19-Мрт-08 (7)
>>Спасибо за быстрый ответ! >>Пытаюсь реализовать с помощью sed: >>sed -ne '/^BMW\s+(.*?)\.car/p' test.txt не ищет. В чем проблема? >> > >sed -n 's/^BMW\s\+\(.*\)\.car.*/\1/p' test.txt Все равно не ищет.
- Поиск и выкусывание нужного текста из файла, phpcoder, 12:06 , 19-Мрт-08 (8)
>>>Спасибо за быстрый ответ! >>>Пытаюсь реализовать с помощью sed: >>>sed -ne '/^BMW\s+(.*?)\.car/p' test.txt не ищет. В чем проблема? >>> >> >>sed -n 's/^BMW\s\+\(.*\)\.car.*/\1/p' test.txt > >Все равно не ищет.Попробуйте так: sed -n 's/^BMW[ \t]*\(.*\)\.car.*/\1/p'
- Поиск и выкусывание нужного текста из файла, agalin, 12:56 , 19-Мрт-08 (14)
>Попробуйте так: sed -n 's/^BMW[ \t]*\(.*\)\.car.*/\1/p' Спасибо! Работает, но выдает нужное поле в той колонке, из которой было вырезано - в данном случае в колонке 2,то есть результат: $> sed -n 's/^BMW[ \t]*\(.*\)\.car.*/\1/p' $> mercedes benz
- !!! усывание нужно, Andrey Mitrofanov, 14:09 , 19-Мрт-08 (18)
>Спасибо! Работает, но >,то есть результат: Стоп! Всем спасибо, ошибка найдена: пользователь не включил мозги и не rtfm. Всем - спасибо, расходитесь уже, не задерживайтесь. :-/
- Поиск и выкусывание нужного текста из файла, 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.0000Name 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) + теперь наш уникальный знак является разделителем полей, по регэкспу выкусываем из него только четвёртое поле - выводим результат
- Поиск и выкусывание нужного текста из файла, Arpo, 13:03 , 19-Мрт-08 (15)
>[оверквотинг удален] >- найти строку, в которой есть фраза ShiftType (/ShiftType/) >- считать следующую строку (n) >- считать следующую строку (n) >- теперь строка через одну от найденной у нас. Нужно "выкусить из >неё 4 столбец > + заменяем повторяющиеся два и более раз пробелы/табуляции во всей >строке на что-то уникальное (s/[ \t]\{2,\}/|/g) > + теперь наш уникальный знак является разделителем полей, по регэкспу >выкусываем из него только четвёртое поле >- выводим результат может так -bash-3.00$ cat 111.txt Datum Name Ellipsoid Name .... WGW-84 WGW-84 Shift Shift Type .... HDA-90 Bursa Wolf ...................
-bash-3.00$ cat 111.txt |sed -n '/Shift\ Type/ { n s/[ \t]\{2,\}/+/g p }'|awk -F+ '{print $2}'
- Поиск и выкусывание нужного текста из файла, Arpo, 13:05 , 19-Мрт-08 (16)
>[оверквотинг удален] >Shift Shift Type > .... >HDA-90 Bursa Wolf > ................... > >-bash-3.00$ cat 111.txt |sed -n '/Shift\ Type/ { >n >s/[ \t]\{2,\}/+/g >p >}'|awk -F+ '{print $2}' Это 100% работает в Solaris10
- Поиск и выкусывание нужного текста из файла, agalin, 13:47 , 19-Мрт-08 (17)
>>-bash-3.00$ cat 111.txt |sed -n '/Shift\ Type/ { >>n >>s/[ \t]\{2,\}/+/g >>p >>}'|awk -F+ '{print $2}' > >Это 100% работает в Solaris10 Правильно ли я понял? $> cat test.txt |sed -n '/Shift\ Type/{ns/[ \t]\{2,\}/+/gp}'|awk -F+ '{print $2}'
- Поиск и выкусывание нужного текста из файла, Arpo, 14:46 , 19-Мрт-08 (19)
>[оверквотинг удален] >>>n >>>s/[ \t]\{2,\}/+/g >>>p >>>}'|awk -F+ '{print $2}' >> >>Это 100% работает в Solaris10 > >Правильно ли я понял? > >$> cat test.txt |sed -n '/Shift\ Type/{ns/[ \t]\{2,\}/+/gp}'|awk -F+ '{print $2}' У меня так не работает поетому пришлось писать на разных строках...
- Поиск и выкусывание нужного текста из файла, phpcoder, 14:52 , 19-Мрт-08 (20)
>>$> cat test.txt |sed -n '/Shift\ Type/{ns/[ \t]\{2,\}/+/gp}'|awk -F+ '{print $2}' Когда автор слепил весь текст в одну строку и у меня не стало работать ;) Потому что для разделения команд нужно использовать точку с запятой (ну или на новой строке писать, чтобы солярка понимала). >У меня так не работает поетому пришлось писать на разных строках... Автор не сообщил ни версию sed'а ни ОС, так что я привёл пример на основе Linux'а. По идее, если автору нужно это на Соляре запускать, то он должен был это сообщить.
- Поиск и выкусывание нужного текста из файла, phpcoder, 14:53 , 19-Мрт-08 (21)
>-bash-3.00$ cat 111.txt |sed -n '/Shift\ Type/ { >n >s/[ \t]\{2,\}/+/g >p >}'|awk -F+ '{print $2}' sed -n '/Shift\ Type/ { n s/[ \t]\{2,\}/+/g p }' <111.txt |awk -F+ '{print $2}' cat тут совершенно не нужен.
- Поиск и выкусывание нужного текста из файла, Arpo, 15:03 , 19-Мрт-08 (24)
>[оверквотинг удален] >>p >>}'|awk -F+ '{print $2}' > >sed -n '/Shift\ Type/ { >n >s/[ \t]\{2,\}/+/g >p >}' <111.txt |awk -F+ '{print $2}' > >cat тут совершенно не нужен. Это кому как удобно...ИМХО
- Поиск и выкусывание нужного текста из файла, agalin, 15:31 , 19-Мрт-08 (25)
>Это кому как удобно...ИМХО Спасибо! Извините, но есть небольшая корректировка к файлу. В файле есть разделитель между Datum Name и WGW-84, Shift и HDA-90 и т.д. ................. Datum Name Ellipsoid Name .... --------------------------------------------- WGW-84 WGW-84 Shift Shift Type .... --------------------------------------------- HDA-90 Bursa Wolf ...................
Получилось, что скрипт вытаскивает этот разделитель теперь :-(
- Поиск и выкусывание нужного текста из файла, phpcoder, 15:33 , 19-Мрт-08 (26)
>Спасибо! Извините, но есть небольшая корректировка к файлу. В файле есть разделитель >между [...] >Получилось, что скрипт вытаскивает этот разделитель теперь :-( А у меня это было предусмотрено ;-)) Сличайте мой скрипт и скрипт от Arpo. ;-)) Подсказка: нужно два n
- Поиск и выкусывание нужного текста из файла, agalin, 15:57 , 19-Мрт-08 (27)
>Подсказка: нужно два n Oгромное спасибо, работает! :-) А если Shift Type встречается несколько раз, как вывести только то, что встретилось первый раз. Заранее спасибо!
- Поиск и выкусывание нужного текста из файла, phpcoder, 16:00 , 19-Мрт-08 (28)
>А если Shift Type встречается несколько раз, как вывести только то, что встретилось первый раз. Заранее спасибо! Добавьте q по вкусу :-)
- Поиск и выкусывание нужного текста из файла, agalin, 16:05 , 19-Мрт-08 (29)
>Добавьте q по вкусу :-) Спасибо! И последнее - как теперь посчитать количество совпадений (то что было найдено при помощи sed и awk)?
- Поиск и выкусывание нужного текста из файла, phpcoder, 16:06 , 19-Мрт-08 (30)
>Спасибо! И последнее - как теперь посчитать количество совпадений (то что было >найдено при помощи sed и awk)? Трудно сказать, вариантов много и мы не знаем деталей. Можно в awk прям и считать, что он там находит, можно в шелле переменную увеличивать. Скорее всего вам wc -l нужно.. он строчки считает. - Поиск и выкусывание нужного текста из файла, agalin, 16:24 , 19-Мрт-08 (31)
>Трудно сказать, вариантов много и мы не знаем деталей. Можно в awk >прям и считать, что он там находит, можно в шелле переменную >увеличивать. Скорее всего вам wc -l нужно.. он строчки считает. И еще один момент: если есть несколько реализаций поски текста с помощью sed&awk и есть несколько реализаций поиска в Perl, как их лучше объединить? - Поиск и выкусывание нужного текста из файла, agalin, 16:26 , 19-Мрт-08 (32)
Хочу добавить, что конечной целью является построение отчетов.
- Поиск и выкусывание нужного текста из файла, phpcoder, 16:29 , 19-Мрт-08 (33)
>И еще один момент: если есть несколько реализаций поски текста с помощью >sed&awk и есть несколько реализаций поиска в Perl, как их лучше >объединить? Ну, например, так: FROM_PERL=`perl ... | wc -l` FROM_AWK=`awk ... | wc -l` FROM_SED=`sed ... | wc -l` printf 'Всего найдено %u\n' "`expr $FROM_PERL + $FROM_AWK + $FROM_SED`"
- Поиск и выкусывание нужного текста из файла, agalin, 16:44 , 19-Мрт-08 (34)
Спасибо всем авторам за помощь! Все очень сильно пригодилось! Было интересно и познавательно! :-) Спасибо!
- Поиск и выкусывание нужного текста из файла, agalin, 21:15 , 19-Мрт-08 (35)
Попутно встретилась еще одна проблема. Если файл имеет немного другое строение: ...........................*****************Projection****************** Datum Name Ellipsoid Name .... --------------------------------------------- WGW-84 Bursa Wolf QWQ90 Flow Burs ... ... *****************Translation***************** Shift Shift Type .... --------------------------------------------- HDA-90 Bursa Wolf FDS-70 Flow Burs ... ... ............................. Нужно в секции Projection отыскать Ellipsoid Name и вывести все поля под ним - Bursa Wolf,Flow Burs и т.д. до секции Translation. Количество этих полей под Ellipsoid Name заранеее не известно. Если в примере ранее использовалось n;n для считывания вниз 2-строк, то теперь не ясно как сместиться вниз на заранее не известное количество строк и вывести их.
- ???, Yes, 22:04 , 19-Мрт-08 (36)
>Попутно встретилась еще одна проблема. Если файл имеетГм, Вам там небольшой Windows на sed-е написать не надо будет? А то одна строчка скрипта всё обрастает "подробностями", а понимание не приходит??
- Поиск и выкусывание нужного текста из файла, agalin, 00:05 , 20-Мрт-08 (37)
Думаю, что нужно обозначить некий блок /Projection/,/Translation/ и уже в этом блоке применить: $> cat test.txt | sed -n '/Ellipsoid\ Name/ {n;n;s/[ \t]\{2,\}/+/g;p;}'|awk -F+ '{print $2}' Но как передать этот блок sed?
- Поиск и выкусывание нужного текста из файла, phpcoder, 08:31 , 20-Мрт-08 (38)
У меня работает, вот так:[c0der@xxx ~]$ cat TEST *****************Projection****************** Datum Name Ellipsoid Name .... --------------------------------------------- WGW-84 Bursa Wolf QWQ90 Flow Burs ... ... *****************Translation***************** Shift Shift Type .... --------------------------------------------- HDA-90 Bursa Wolf FDS-70 Flow Burs You have new mail. [c0der@xxx ~]$ sed -n '/Projection/{n;/Ellipsoid Name/{n;:l n;/Translation/q;s/[^[:space:]]\+[[:space:]]\+\(.*\)/\1/p;bl}}' TEST Bursa Wolf Flow Burs ... [c0der@xxx ~]$ Разбирайтесь как работает, адаптируйте под ваш Солярис :) В кратце: тут организован этакий цикл -- до тех пор пока в строке нет слова Translation выполняются некие действия (замена, печать).
- Поиск и выкусывание нужного текста из файла, agalin, 17:51 , 20-Мрт-08 (39)
>В кратце: тут организован этакий цикл -- до тех пор пока в >строке нет слова Translation выполняются некие действия (замена, печать). Сложно понять 2 вложения! А не покажете для начинающего только одно вложение? Например по Projection найти Bursa Wolf? - Спасибо всем!, agalin, 21:53 , 21-Мрт-08 (40)
Спасибо всем! Было позновательно и интересно! :-) Отдельное спасибо phpcoder'у за терпение! :-) Тема закрыта!
|