>>Вот, порадуй преподавателя:
>
>Ндамс... Ну, теперь, когда мы школяру неинтересны, расскажите пожалуйста,
>
>>$ 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