1 (04.07.2012 09:35:56 отредактировано valet)

Имеется файл с запросами типа:

...
300 разных обоин iPad [PNG/iPad]
300 рецептов. Блюда из духовки
300 рецептов. Сырая пища и ее приготовление
300 лучших песен для детей
300 самых важных английских слов в картинках для начинающих
300 самых клёвых рингтонов
300 самых распространенных английских слов
300 §С§в§Ъ§Ы§и§Ц§У §Я§С §Ф§а§Т§Э§Ъ§Я§г§Ь§а§Ю
300 семей которые правят миром
300 советов и 200 рецептов рыболову
...

Нужно удалить из него мусор. В данном случае это запросы:

300 лучших песен для детей
300 §С§в§Ъ§Ы§и§Ц§У §Я§С §Ф§а§Т§Э§Ъ§Я§г§Ь§а§Ю

То есть после обработки такого файла должно остаться:

...
300 разных обоин iPad [PNG/iPad]
300 рецептов. Блюда из духовки
300 рецептов. Сырая пища и ее приготовление
300 самых важных английских слов в картинках для начинающих
300 самых клёвых рингтонов
300 самых распространенных английских слов
300 семей которые правят миром
300 советов и 200 рецептов рыболову
...

Я сначала подумал что можно выполнить банальной сортировкой с отрезкой ненужного куска, но не получилось, собственно, что и видно с этого примера.

Думаю что можно как-то sed'ом отбирать нужной регуляркой, которая будет отбирать нормальные запросы - а это все латинские и кириллические символы.
Но остановился на уровне идей, как написать регулярку пока не знаю. Может кто-то на любимом по линуксу форуме поможет ab

П.С. А я пока думаю сам параллельно ab. Если найду решение - обязательно тут запощу.

2

Вот так пойдёт?

cat data_file | egrep -v "§|ѓ"

3

Врядли, нет гарантии что там кроме этих 2х не может быть других левых символов. Может лучше описать регулярку нужных символов.

Vascom пишет:

§|ѓ

4 (04.07.2012 09:51:33 отредактировано Vascom)

Конечно, добавь туда ещё несколько нужных символов, которые точно не встретятся в хороших строках. Ну и прогони - посмотри.
Ты же не привёл весь файл. А тот отрывок, что приведён отлично фильтруется и этой регуляркой. Телепатия уже на пределе ab

5

Vascom пишет:

Ты же не привёл весь файл.

Там около 3 млн. строк ab
Задача - написать регулярку для взятия правильных вариантов - как мне кажется будет корректнее. Я точно знаю, что мне нужны все латинские и кириллические символы, знаки препинания и т.д. А мусора там всякого много, ну например типа такого:

������� �13

и я же не могу предвидеть все варианты.

6

Если ты не можешь предвидеть все варианты, то ты не сможешь создать регулярное выражение!

7 (04.07.2012 10:29:53 отредактировано Fat-Zer)

можно на костылях iconv'а как-то так сработать:

cat file | while read STR; do
  echo "$STR" | inconv -t KOI-8 && >/dev/null && 
    echo "$STR" | inconv -t cp1251 >/dev/null && 
    echo "$STR" | inconv -t ISO-8859-5 >/dev/null && 
      echo "$STR">>out_file
done

если текст в три кирилические кодировки конвертируется, то он скорей всего хороший...

95% процентов проблем находятся между клавиатурой и стулом.

8

Vascom пишет:

Если ты не можешь предвидеть все варианты, то ты не сможешь создать регулярное выражение!

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

9

Fat-Zer пишет:

если текст в три кирилические кодировки конвертируется, то он скорей всего хороший...

скорее всего, спасибо, сейчас попробую.

10

valet пишет:
Vascom пишет:

Если ты не можешь предвидеть все варианты, то ты не сможешь создать регулярное выражение!

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

Ну а если наша буква или точка входит в плохую стоку, тогда как ты поступишь?

11

Vascom пишет:

Ну а если наша буква или точка входит в плохую стоку, тогда как ты поступишь?

Да, точка действительно может входить, но не наша буква. В регулярку для хороших вариантов значит не надо включать всякие там скобки, запятые, точки т.д. -да и зачем, тут принцип должен быть - если в строке есть хотя бы одна нужная буква.

12

Ну гляди, у тебя в строке

300 §С§в§Ъ§Ы§и§Ц§У §Я§С §Ф§а§Т§Э§Ъ§Я§г§Ь§а§Ю

куча наших букв.

13

Vascom пишет:

куча наших букв.

да, дайствительно, даже не обратил внимания.

Fat-Zer пишет:

cat file | while read STR; do echo "$STR" | iconv -t KOI-8 && >/dev/null && echo "$STR" | iconv -t cp1251 >/dev/null && echo "$STR" | iconv -t ISO-8859-5 >/dev/null && echo "$STR">>out_file done

Это способ действительно отлично работает. Из плохих остаются только запросы типа:

????????? (2012) (76,77 ?????)
?????????? (2012) (77,78 ?????)
??? ??????? ????? (2012) (7,8 ?????)
?????? (2012) (7,8 ?????)
?????????? ????? (2012) (7,8 ?????)
???????????? ??? ???? (2012) (7,8 ?????)
?????? ?? ?????? (2012) (7,8,9 ?????)
????????? (2012) (8 ?????)
?????????? (2012) (82,83 ?????)

Вот убрать бы еще и их. Тут принцип - если в строке более одного "?" - убираем.

14

Ну теперь-то можно? ab

 | egrep -v "\?\?"

15 (04.07.2012 11:32:28 отредактировано valet)

Vascom пишет:

Ну теперь-то можно? ab

 | egrep -v "\?\?"

Спасибо, отлично ab

Еще раз (может кому-то пригодится), полное решение вопроса:

cat file | while read STR; do
  echo "$STR" | iconv -t KOI-8 && >/dev/null &&
    echo "$STR" | iconv -t cp1251 >/dev/null &&
    echo "$STR" | iconv -t ISO-8859-5 >/dev/null &&
      echo "$STR">>out_file
done
cat out_file | egrep -v "\?\?" > result.txt

Всем спасибо за помощь, файл еще обрабатывается, потому что повторюсь - там 3 млн строк ab, но уже вижу, что вопрос решен.

16

пора уже отдельную ветку создавать для тем про обработку текста ab

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

17

moshell пишет:

пора уже отдельную ветку создавать для тем про обработку текста ab

Да их тысячи в разделе Программирование.

18

дык тем более

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс