Форум русскоязычного сообщества Ubuntu


За новостями русскоязычного сообщества и Ubuntu в целом можно следить на нашей страничке в Google+

Автор Тема: Написание скрипта для нахождения определенных номеров на bash  (Прочитано 526 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн _alien_

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Доброго времени суток.

Появилась необходимость написать скрипт, который будет искать телефонные номера из определенного диапазона (без разрывов) по маске.
Маска следующего формата:
XYYYYY
XYYYYZ
XYYYZY
XYZXYZ
XYZZZZ
XYYZZZ
XYZHHH
XYZXXX и так далее.
Всего таких масок довольного много, они лежат в файле :)
Появилось решение написать скрипт, который бы это делал автоматически.
Требуется, чтобы при прохождении цикла если номер попадает в одну из этих масок, то чтобы он писался в файл с названием маски.

Вопрос заключается в следующем - как сделать чтобы номер определялся на соответствие маске? Возможно, есть какое-то очень хитрое регулярное выражение, поскольку писать это все на if-ах - жуть неимоверная.

Если у кого-то есть опыт или знания, могущие помочь решению, - поделитесь пожалуйста.

Ubuntu 9.10,
ищу инвайт на Хабрахабр...

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
В чем проблемы-то ?
Вроде все достаточно тривиально.
Единственное, что лучше сделать. Шаблоны загоните в отдельный файл и выбирайте по 1 записи для поиска.
PS. Сейчас прочитал еще раз и вижу Вы на правильном пути.
« Последнее редактирование: 23 Март 2010, 09:03:31 от alexander.pronin »

Оффлайн ploop

  • Активист
  • *
  • Сообщений: 762
    • Просмотр профиля

Оффлайн _alien_

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
И снова даю эту ссылку: http://www.opennet.ru/docs/RUS/bash_scripting_guide/
Спасибо за ссылку.
выбирайте по 1 записи для поиска.
Вопрос в том, как сравнивать шестизначное число на соответствие маске.
Вообще ожидал примера. :-[
Но в любом случае спасибо  :)
« Последнее редактирование: 23 Март 2010, 09:22:47 от _alien_ »
Ubuntu 9.10,
ищу инвайт на Хабрахабр...

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
grep и sed посмотрите.
Если будут конкретные вопросы - задавайте.
Если по хорошему. Дайте кусок файла, в котором хотите что-то искать (или весь файл, если не огромный) и что надо в нем найти. А так разговор абстрактный.
На абстрактный вопрос даются абстрактные ответы.
« Последнее редактирование: 23 Март 2010, 09:51:28 от alexander.pronin »

Оффлайн _alien_

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
файл с исходными данными (номера)
100000
100001
100002
....
200000
, всего 100 000 строк.

Надо найти все номера, соответствующие маске (например XYZZZZ)
Результат: 101111, 102222, 103333 и так далее.
Надо найти все номера, соответствующие маске (например XYXYXY)
Результат: 101010, 111111, 121212, 131313 и так далее.

то есть в маске XYXYXY указано, что на 1, 3 и 5 позиции стоит одна цифра, а на 2, 4, 6 - другая.
Пока я не могу найти, чтобы в регулярном выражении учитывался именно этот принцип построения маски, например
 cat file.txt | egrep ....[0-9]{2}выводит все строки, а не те, у которых две последние цифры совпадают.


Ubuntu 9.10,
ищу инвайт на Хабрахабр...

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
В Вашем случае надо генерировать конкретные шаблоны для поиска из абстрактного шаблона.
Скажем на php будет как-то так
for($x=0; $x<=9;$x++) {
for($y=0; $y<=9;$y++) {
for($z=0; $z<=9;$z++) {
// формируем конкретный шаблон из абстрактного XYZXYZ
$strreg=$x.$y.$z.$x.$y.$z;
...// поиск по $strreg
}
}
}
« Последнее редактирование: 23 Март 2010, 10:32:52 от alexander.pronin »

Оффлайн _alien_

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
В Вашем случае надо генерировать конкретные шаблоны для поиска из абстрактного шаблона.
Нельзя ли поподробнее?
Ubuntu 9.10,
ищу инвайт на Хабрахабр...

Оффлайн baklan

  • Активист
  • *
  • Сообщений: 386
    • Просмотр профиля
    • backline
В рег. выражениях не силен, вот на php попробовал
http://www.backline.ru/mask.php

механизм вот такой
for($i=0; $i<=9; $i=$i+1){
for($k=0; $k<=9; $k=$k+1){
for($l=0; $l<=9; $l=$l+1){
//for($m=0; $m<=9; $m=$m+1){
//for($n=0; $n<=9; $n=$n+1){
//for($o=0; $o<=9; $o=$o+1){
$num001="".$i.$i.$i.$k.$k.$k;
if ($mynum==$num001){echo "<b>XXXYYY</b> <br />"; break;}
$num002="".$i.$k.$k.$k.$k.$k;
if ($mynum==$num002){echo "<b>XYYYYY</b><br />"; break;}
$num003="".$i.$k.$l.$i.$k.$l;
if ($mynum==$num003){echo "<b>XYZXYZ</b><br />"; break;}
$num004="".$i.$i.$k.$k.$l.$l;
if ($mynum==$num004){echo "<b>XXYYZZ</b><br />"; break;}

// .. и т.д. все комбинации

//}
//}
//}
}
}
}

Оффлайн _alien_

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
baklan,
поскольку писать это все на if-ах - жуть неимоверная.
шаблонов около 50
Ubuntu 9.10,
ищу инвайт на Хабрахабр...

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
В Вашем случае надо генерировать конкретные шаблоны для поиска из абстрактного шаблона.
Нельзя ли поподробнее?
Подрисовал в пост поподробнее.

Пользователь решил продолжить мысль 23 Март 2010, 06:50:19:
шаблонов около 50
Эти шаблоны надо парсить на XYZ для подстановки конкретных $x $y $z вместо абстрактных.


Пользователь решил продолжить мысль 23 Март 2010, 08:54:47:
ЗЫ. Скрипт лучше писать на перле или php. Будет легче жить.
А тему надо переносить в программирование.
« Последнее редактирование: 23 Март 2010, 10:55:47 от alexander.pronin »

Оффлайн baklan

  • Активист
  • *
  • Сообщений: 386
    • Просмотр профиля
    • backline
baklan,
поскольку писать это все на if-ах - жуть неимоверная.
шаблонов около 50
Ну это совсем нестрашно, 10 минут и впишите все 50. Но мой скрипт как бы еще не все делает, ведь номер 111111 может подойти под XXXXXX и XXXYYY , если X=Y . Ну а без if  вообще нельзя, под if подразумевается условие, а как раз условие мы ищем. Рег. выражения - это тоже условия.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
Да интересный вопрос. Могут ли x==y x==z y==z, это вопрос к автору. Если не могут, то надо исключать поиск в этих случаях.

Оффлайн _alien_

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Если номер подходит под две или больше масок, то его надо вписывать в каждый файл. Сорри, не упомянул раньше :)
php, к сожалению, почти не знаю.
Под фразой "поскольку писать это все на if-ах - жуть неимоверная." подразумевал следующий код:

for (( i = 100000; i < 200000; i++ ))
do
      let "a = (( $i / 100000 ))"
      let "b = (( $i / 10000 ) % 10 )"
      let "c = (( $i / 1000 ) % 10 )"
      let "d = (( $i / 100 ) % 10  )"
      let "e = (( $i / 10 ) % 10  )"
      let "f = (( $i / 1 ) % 10)"
    if [ "$c" -eq "$d" ] && [ "$e" -eq "$f" ] && [ "$c" -eq "$e" ]
    then
    echo "$a$b$c$d$e$f" >> temp.txt ;
    fi
done
Ubuntu 9.10,
ищу инвайт на Хабрахабр...

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
Если номер подходит под две или больше масок, то его надо вписывать в каждый файл. Сорри, не упомянул раньше :)
php, к сожалению, почти не знаю.
Если C знаете, то через пару недель будете как рыба в воде. С перлом тоже.

 

Страница сгенерирована за 0.059 секунд. Запросов: 22.