LINUX.ORG.RU

на чём угодно, хоть на питоне.

mashina ★★★★★
()

> На чем лучше писать скрипт?

на том, на чём умеешь ;)

perl -MList::Util=max -nE 'BEGIN{$c=0}END{say$c}$c=max$c,tr,;,;,' file.txt
arsi ★★★★★
()
$ echo -e "1;2;3;4;5;\n1;2;3;\n1;2;" > greptest
$ cat greptest
1;2;3;4;5;
1;2;3;
1;2;
$ sed s/[^\;]//g greptest | wc --max-line-length
5
adriano32 ★★★
()
max([line.count(';') for line in open('/usr/include/stdlib.h').readlines()])

(не проверял)

true_admin ★★★★★
()

ещё вариант)

perl -MList::Util=max -E 'say max map{tr,;,;,}<>' file.txt

на больших файлах, скорее всего, будет тормозить^Wжрать память.

arsi ★★★★★
()

Всем спасибо. Буду думать.

P.S. Нужно для анализа корректности CSV-файла.

pacify ★★★★★
() автор топика
Ответ на: комментарий от arsi

хм… я передумал, нафик -F…

perl -nE'END{say$#c}$c[y+;+;+]++' file
arsi ★★★★★
()
Ответ на: комментарий от geekless
~/abs/gtk2$ find -name '*.c' | xargs cat | ruby -e 'puts STDIN.lines.map{|s|s.gsub(/[^;]/,"").size}.max'
-e:1:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
	from -e:1:in `block in <main>'
	from -e:1:in `lines'
	from -e:1:in `each'
	from -e:1:in `map'
	from -e:1:in `<main>'
xargs: cat: terminated by signal 13
anonymous
()

Натравливал на сырцы gtk2, результаты в порядке возрастания скорости:

time find -name '*.c' | xargs cat | sed s/[^\;]//g | wc --max-line-length
real	0m51.045s
user	0m51.087s
sys	0m0.340s

time find -name '*.c' | xargs cat | perl -F\; -anE 'END{say$#c}$c[$#F]++'
real	0m6.338s
user	0m6.203s
sys	0m0.307s

time find -name '*.c' | xargs cat | python -c 'import sys; print max(l.count(";") for l in sys.stdin)'
real	0m2.752s
user	0m2.690s
sys	0m0.220s

time find -name '*.c' | xargs cat | perl -MList::Util=max -E 'say max map{tr,;,;,}<>'
real	0m2.729s
user	0m2.347s
sys	0m0.550s

time find -name '*.c' | xargs cat | perl -MList::Util=max -nE 'BEGIN{$c=0}END{say$c}$c=max$c,tr,;,;,'
real	0m2.717s
user	0m2.630s
sys	0m0.273s

time find -name '*.c' | xargs cat | perl -nE'END{say$#c}$c[y+;+;+]++'
real	0m1.703s
user	0m1.590s
sys	0m0.250s

Если ты не шаришь в кракозябрах, то ответ очевиден.

anonymous
()
Ответ на: комментарий от anonymous

Всё верно, в ruby, начиная с v1.9, символьные данные «типизированы» по кодировке, поэтому в общем случае это не работает:

vadim@host3:~$ echo -e 'a;b;c;\nй;ц;у;к;е;н;' | iconv -t 'cp1251' |  ruby -e 'puts STDIN.lines.map{|s|s.gsub(/[^;]/,"").size}.max'
-e:1:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
	from -e:1:in `block in <main>'
	from -e:1:in `lines'
	from -e:1:in `each'
	from -e:1:in `map'
	from -e:1:in `<main>'
Status: 1

Нужно читать ввод в сыром режиме:

vadim@host3:~$ echo -e 'a;b;c;\nй;ц;у;к;е;н;' | iconv -t 'cp1251' |  ruby -e 'STDIN.set_encoding "BINARY"; puts STDIN.lines.map{|s|s.gsub(/[^;]/,"").size}.max'
6

А вообще этот код надо, если по уму, переписать через each, т.к. интерпретатор недостаточно умен, чтобы прооптимизировать вызов map{}.max, и в процессе выполнения создаст массив чисел с длиной, равной числу строк во входном файле.

geekless ★★
()
Ответ на: комментарий от anonymous

Да, что-то как-то время работы варианта с sed удручает.

geekless ★★
()
Ответ на: комментарий от geekless

Быстро, решительно убирай регулярки, а то так и будешь наравне с седом:

time find -name '*.c' | xargs cat | ruby -e 'STDIN.set_encoding "BINARY"; puts STDIN.lines.map{|s|s.gsub(/[^;]/,"").size}.max'
real	0m57.284s
user	0m57.150s
sys	0m0.453s
anonymous
()
Ответ на: комментарий от anonymous

Вариации на тему:

ruby -e 'STDIN.set_encoding "BINARY"; puts STDIN.lines.map{|s|s.count(";")}.max'
ruby -e 'STDIN.set_encoding "BINARY"; r = 0; STDIN.lines{|s| r = [s.count(";"), r].max}; puts r'
geekless ★★
()
Ответ на: комментарий от geekless

Ну вот ТС, может выбрать еще один человекочитабельный вариант. Еще бы без «set_encoding», флажка у интерпретатора никакого нет?

time find -name '*.c' | xargs cat | ruby -e 'STDIN.set_encoding "BINARY"; puts STDIN.lines.map{|s|s.count(";")}.max'
real	0m5.868s
user	0m5.830s
sys	0m0.243s
anonymous
()
Ответ на: комментарий от anonymous

> флажка у интерпретатора никакого нет?

Хз. Мне парсить не-utf8 потоки без надобности, не сталкивался. Гуглить лень.

geekless ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.