The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Задан текстовый файл..., !*! pavlick, 02-Дек-09, 18:19  [смотреть все]
Задан текстовый файл file.txt
Вывести статистику, в которой будет описано сколько раз встречаются в данном текстовом файле слова на каждую букву.
Пример: 5 слов на букву a, 0 слов на букву b, ..., 1 слово на букву z
  • Задан текстовый файл..., !*! аноним, 18:50 , 02-Дек-09 (3)
    >Задан текстовый файл file.txt
    >Вывести статистику, в которой будет описано сколько раз встречаются в данном текстовом
    >файле слова на каждую букву.
    >Пример: 5 слов на букву a, 0 слов на букву b, ...,
    >1 слово на букву z

    Выведите статистику, я разрешаю.

    man cut
    man sort
    man uniq

    • Задан текстовый файл..., !*! temny, 21:55 , 02-Дек-09 (6)
      Вот, порадуй преподавателя:

      $ dmesg > file.txt
      $ f=`cat file.txt`;for i in {a..z};do q=`echo \ $f|sed 's! ['$i${i^^}'][^ ]*!^!g;s![^^]!!g'`;echo $i: ${#q}; done
      a: 175
      b: 27
      c: 101
      d: 64
      e: 74
      f: 43
      g: 8
      h: 14
      i: 74
      j: 2
      k: 4
      l: 13
      m: 39
      n: 12
      o: 103
      p: 159
      q: 5
      r: 68
      s: 61
      t: 37
      u: 136
      v: 23
      w: 13
      x: 1
      y: 0
      z: 3

      • Задан текстовый файл..., !*! аноним, 22:14 , 02-Дек-09 (7)
        >Вот, порадуй преподавателя:

        тонко :))

      • Задан текстовый файл..., !*! Andrey Mitrofanov, 10:19 , 03-Дек-09 (8)
        >Вот, порадуй преподавателя:

        Ндамс... Ну, теперь, когда мы школяру неинтересны, расскажите пожалуйста,

        >$ dmesg > file.txt
        >$ f=`cat file.txt`

        а файл >128К? а >1M? а с символами $, !, <, > и т.п.??

        >;for i in {a..z}

        Гм, богато... Спасибо! ...man bash -- каждый раз что-то новое |)

        >;do q=`

        Аналогично, если слов >N={128k,1M,...}, то каменный цветок не пролезет?

        >echo \ $f
        >|sed 's! ['$i${i^^}'][^ ]*!^!g;s![^^]!!g'`;echo

        ${i^^} - это на каком шеле? и "предупреждать надо"(тм)

        Меня б "sed -i" спас :), но я б с самого начала по-другому сделал.

        >$i: ${#q}; done
        >a: 175

        Маловато и медленновато будет!

        Если без "нулей", то

        $ pwd
        /usr/share/doc/exim4
        $ ls -l spec.txt.gz
        -rw-r--r-- 1 root root 414956 2006-07-31 18:19 spec.txt.gz
        $ zcat spec.txt.gz|head|grep evisio
        |Revision 4.63                       |27 July 2006                     |PH    |
        $ time zcat spec.txt.gz |wc -c
        1435340

        real    0m0.066s
        user    0m0.040s
        sys     0m0.024s
        $ time ( zcat spec.txt.gz |egrep -o "[a-z][^ ]+"|egrep -o "^[a-z]"|tr [:upper:] [:lower:]|sort|uniq -c|sort -k2 )
          64605 a
          11846 b
          30114 c
          36166 d
        124868 e
          21642 f
          15230 g
          39851 h
          72815 i
            507 j
           3668 k
          35602 l
          24757 m
          63988 n
          66860 o
          21156 p
           1722 q
          58303 r
          75325 s
          86732 t
          25755 u
           8803 v
           9243 w
           5696 x
          12582 y
            569 z

        real    0m16.397s
        user    0m15.517s
        sys     0m0.816s
        $ _

        Чего-то моментальненько...

        Ждём варианта на %) перле -- в три раза короче и в 10 раз быстрее. |-) С бенчмарками!!

        PS: И да, что-то подсказывает %)))) мне, что c "двумя grep-ами" что-то $) не так...

        • Задан текстовый файл..., !*! pavlick, 11:49 , 03-Дек-09 (9)
          cat file | tr "[:upper:]" "[:lower:]"| sed 's/\s/\n/g' | egrep -o "^[a-z]" |sort| uniq -c

          но! если в файле не встречаются слова на z, мы и не увидим

          0 z

          • Задан текстовый файл..., !*! Andrey Mitrofanov, 13:29 , 03-Дек-09 (10)
            ВНИМАНИЕ! Ужос-ужос-ужос впереди... Дэйв! ... Дэ-эйв!....

            >cat file | tr "[:upper:]" "[:lower:]"| sed 's/\s/\n/g' | egrep -o "^[a-z]"

            |sed -n 's/\([a-z]\)[a-z]*[^a-z]*/\l\1\n/i;t 1;d;:1 P;D'

            ВАРНИНГ: это GNU sed. ВАРНИНГ2: а оно работает? %) _Я_ предупредил....

            >|sort| uniq -c
            >но! если в файле не встречаются слова на z, мы и не
            >увидим

            Ну, я ж и написал -без "нулей"-. Добавить "нули" оставляю в качестве "упражнения читателю"(тм).

          • Задан текстовый файл..., !*! аноним, 04:48 , 04-Дек-09 (13)
            >но! если в файле не встречаются слова на z, мы и не
            >увидим

            Молодец, но все гораздо проще - ты не прочитал man cut.

        • Задан текстовый файл..., !*! temny, 17:35 , 03-Дек-09 (11)
          >>Вот, порадуй преподавателя:
          >
          >Ндамс... Ну, теперь, когда мы школяру неинтересны, расскажите пожалуйста,
          >
          >>$ dmesg > file.txt
          >>$ f=`cat file.txt`
          >
          >а файл >128К? а >1M? а с символами $, !, <, > и т.п.??

          Длинные файлы будут обрабатываться существенно медленнее, чем в предложеном вами решении, но всё-таки будут :)
          А вот как могут навредить спецсимволы я пока не вижу, во всяком случае вариант
          (dmesg ; echo $'!asd!\n >> <\n$$asd\n!$') > file.txt
          отработал без ошибок и с верной статистикой.

          >${i^^} - это на каком шеле? и "предупреждать надо"(тм)

          $ i=AbC; echo $i - ${i^^} - $BASH_VERSION
          AbC - ABC - 4.0.35(0)-release

          >Меня б "sed -i" спас :), но я б с самого начала
          >по-другому сделал.

          В реализациях sed, которые я нахожу в зоне прямой видимости, -i это "edit files in place", но я думаю понял, что вы имели в виду :) - Согласен, вместо ${i^^} можно использовать "case insensetive regex".

          >$ time zcat spec.txt.gz |wc -c
          >1435340
          >$ time ( zcat spec.txt.gz |egrep -o "[a-z][^ ]+"|egrep -o "^[a-z]"|tr [:upper:]
          >[:lower:]|sort|uniq -c|sort -k2 )
          >  64605 a

          ...
          >real    0m16.397s
          >user    0m15.517s
          >sys     0m0.816s
          >$ _
          >
          >Чего-то моментальненько...
          >
          >Ждём варианта на %) перле -- в три раза короче и в
          >10 раз быстрее. |-) С бенчмарками!!

          Перла я не знаю, но могу предложить вот такой вариант на awk - не короче, но быстрее:
          $ time ( a=`echo {a..z}`;echo `head -c 1435340 /usr/local/info/mysql.info`|awk 'BEGIN{RS=" ";FS="";r="'${a// }'";split(r,a,"");} /^[a-zA-Z]/ {q[index(r,tolower($1))]++}END{for(i=1;i<=length(r);i++) printf "%s: %d\n",a[i],q[i];}' )
          a: 36506
          b: 13008
          c: 16351
          d: 29531
          e: 6163
          f: 31214
          g: 9718
          h: 9949
          i: 27468
          j: 5505
          k: 21601
          l: 16672
          m: 69568
          n: 20985
          o: 19223
          p: 23766
          q: 5697
          r: 22148
          s: 41965
          t: 48941
          u: 20232
          v: 12933
          w: 49770
          x: 138
          y: 8012
          z: 124

          real    0m4.396s
          user    0m2.830s
          sys     0m1.101s

          • Задан текстовый файл..., !*! Andrey Mitrofanov, 19:06 , 03-Дек-09 (12)
            >>>$ dmesg > file.txt
            >>>$ f=`cat file.txt`
            >>
            >>а файл >128К? а >1M? а с символами $, !, <, > и т.п.??
            >
            >Длинные файлы будут обрабатываться существенно медленнее, чем в предложеном вами решении, но
            >всё-таки будут :)

            Действительно... Когда-то давно, помнится(+склерозз) наступал на грабли с ограничением макс.длины ком.строки в ~128К или 100К -- перепутал чего-то (с багом в xargs-е? ограничения MS-DOS-а в ??К?! %-D ).

            >А вот как могут навредить спецсимволы я пока не вижу, во всяком
            >случае вариант

            $ for f in {a..z}{a..z}{a..Z}; do cat 7676-13^01 ; done >file.txt
            $ f=`cat file.txt`
            $ ls -l file.txt
            -rw-r--r-- 1 abm abm 15499328 Дек  3 18:46 file.txt
            $ echo "$f"|wc -c
            15499328
            $ echo $f|wc -c
            15126176
            $ _

            Ну, на вскидку патч Бармина в .txt не "кладётся", только "небольшая" разница в показаниях... И совсем не в строке с _q=`_, а c _echo \ $f_ -- не в спортлото, а в карты, да. :(

            >>${i^^} - это на каком шеле? и "предупреждать надо"(тм)
            >
            >$ i=AbC; echo $i - ${i^^} - $BASH_VERSION
            >AbC - ABC - 4.0.35(0)-release

            "Я что-то пропустил?!" :))

            $ i=AbC; echo $i - ${i^^} - $BASH_VERSION
            bash: ${i^^}: bad substitution
            $ echo $BASH_VERSION
            3.2.39(1)-release

            >В реализациях sed, которые я нахожу в зоне прямой видимости, -i это
            >"case insensetive regex".

            :/ grep -i попутал с sed s///i

            >>real    0m16.397s
            >>Чего-то моментальненько...

            s/ .\+ь/-то не момоменталь/

            >>в три раза короче и в 10 раз быстрее.
            >Перла я не знаю, но могу предложить вот такой вариант на awk

            Я тож, но :) перл-еры пока не купились на бейт.




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

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