Задан текстовый файл file.txt
Вывести статистику, в которой будет описано сколько раз встречаются в данном текстовом файле слова на каждую букву.
Пример: 5 слов на букву a, 0 слов на букву b, ..., 1 слово на букву z
>Задан текстовый файл file.txt
>Вывести статистику, в которой будет описано сколько раз встречаются в данном текстовом
>файле слова на каждую букву.
>Пример: 5 слов на букву a, 0 слов на букву b, ...,
>1 слово на букву zВыведите статистику, я разрешаю.
man cut
man sort
man uniq
Вот, порадуй преподавателя:
$ 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
>Вот, порадуй преподавателя:тонко :))
>Вот, порадуй преподавателя:Ндамс... Ну, теперь, когда мы школяру неинтересны, расскажите пожалуйста,
>$ 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
1435340real 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 zreal 0m16.397s
user 0m15.517s
sys 0m0.816s
$ _Чего-то моментальненько...
Ждём варианта на %) перле -- в три раза короче и в 10 раз быстрее. |-) С бенчмарками!!
PS: И да, что-то подсказывает %)))) мне, что c "двумя grep-ами" что-то $) не так...
cat file | tr "[:upper:]" "[:lower:]"| sed 's/\s/\n/g' | egrep -o "^[a-z]" |sort| uniq -cно! если в файле не встречаются слова на z, мы и не увидим
0 z
ВНИМАНИЕ! Ужос-ужос-ужос впереди... Дэйв! ... Дэ-эйв!....>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, мы и не
>увидимНу, я ж и написал -без "нулей"-. Добавить "нули" оставляю в качестве "упражнения читателю"(тм).
>но! если в файле не встречаются слова на z, мы и не
>увидимМолодец, но все гораздо проще - ты не прочитал man cut.
>>Вот, порадуй преподавателя:
>
>Ндамс... Ну, теперь, когда мы школяру неинтересны, расскажите пожалуйста,
>
>>$ 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: 124real 0m4.396s
user 0m2.830s
sys 0m1.101s
>>>$ 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Я тож, но :) перл-еры пока не купились на бейт.