LINUX.ORG.RU

предложите замену


0

1

часто использую такие конструкции:

$ echo '3 2 1' | awk '{print $3}' 1

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

★★★★
Ответ на: комментарий от invy

Если это будет вывод в консоль, то вы и 3 кб в секунду скорее всего не достигните. Я только что сделал cat mypdf.pdf размером в несколько сотен кб, выводилось около 4-х секунд. При это скорость моего терминала - 38 кб/с.

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

Так вот ещё раз выражаю своё недоумение: зачем писать велосипед, если проблема не в awk/sed и других утилитах, а в том что пользователю хочется вывести результаты в консоль. Велосипед тоже в консоль будет так же медленно выводить результаты.

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

Так вот ещё раз выражаю своё недоумение: зачем писать велосипед, если проблема не в awk/sed и других утилитах, а в том что пользователю хочется вывести результаты в консоль.

Конкретно у меня задачи получать из файла строки и парсить их так чтобы разные колонки попадали в разные bash переменные, что я и добился заюзав read сразу после создания топика. Ранее я думал что read читает всю строку в одну переменную (которую я парсил awk), а она оказывает может одновременно и парсить читая во много переменных - разница по времени порядки.

Всем спасибо! Про set и массивы то-же пригодится в будущем, не знал, спасибо за советы!

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

Док, ты меня так не огорчай, а то дети подумают, что ты сливать начал.
Я же без наездов, а просто из интереса проверил твой вариант с заявленной производительностью 'на порядок' лучше, чем awk,думал у тебя какое интересное предположение может быть по поводу результатов.
Старался, понимаешь, руками набивал 35 тысяч строк (дальше устал просто), а ты теперь про 3 строки зачем-то говоришь,никак обидеть хочешь.

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

Я же без наездов, а просто из интереса проверил твой вариант с заявленной производительностью 'на порядок' лучше

ну что-бы проверять, скрипты должны быть эквивалентные. А эти - нет. На самом деле, тут вообще РАЗНЫЕ задачи решаются. И по разному.

$ time awk '{ print $NF }' tmp/k.txt >awk.k

real	0m7.014s
user	0m5.639s
sys	0m0.315s
$ time sed 's/.* //' tmp/k.txt >sed.k

real	0m13.422s
user	0m11.444s
sys	0m0.357s
gawk _тут_ работает несколько быстрее. Не трудно догадаться почему - найти последнее поле естественно быстрее, чем любые символы до первого пробела. Да, и результат отличается - если в строчке вообще нет пробела, то sed такую строчку не меняет. А gawk вырезает первые пробельные символы (это исходники на C, ядро Linux(частично), 2 746 837 строк), например \t. Если это исправить, то sed вообще в ж:
$ time sed 's/.*\s//' tmp/k.txt >sed.k

real	0m38.330s
user	0m32.577s
sys	0m0.895s
(тут тоже не совсем то, но более похоже)

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

что касается bash и его read

$ time cat tmp/k.txt | while read A B C; do :; done

real	6m59.898s
user	3m57.625s
sys	2m4.043s
комментарии излишни - bash маздай :-)

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

комментарии излишни - bash маздай :-)

нужен компилируемый вариант bash ) типа отладился в режиме интерпретатора, потом скомпилировал и запускаешь. есть что то такое? C SHELL там к примеру? Кто в курсе? надо поучить его...

На C/C++ переписать можно, вот только часто это какие то скрипты на одну задачу на один раз - запустить и забыть. Для такого bash подходит лучше - разработка более быстрее, но по скорости конечно сливает это да...

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

нужен компилируемый вариант bash

не нужен. просто когда пишешь что-то, надо думать головой, а не ж..й. В принципе, в проекте есть компилируемый вариант sed (в офф исходниках, только опции компиляции надо подправить). IRL выигрыш небольшой по времени. Однако, если поставить права 4711, то немного увеличивается безопасность таких sed «скриптов».

про компиляцию bash не в курсе. ИМХО не нужен - этот ЯП тормозной by design ИМХО.

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

я же не зря написал про C SHELL, не обязательно bash, нужно что то с простым синтаксисом, похожими возможностями по вызову внешних программ и возможностью компиляции. может для этого и питон какой нибудь подойдет (я его не знаю).

часто какие то прототипы или скрипты на один раз я пишу на bash с вызовом внешних unix программ, а если оно слишком тормозное или используется часто то частично или полностью переписывается на C/C++.

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

может для этого и питон какой нибудь подойдет (я его не знаю).

зря. простой язык. есть смысл потратить несколько часов жизни, и не париться.

drBatty ★★
()

сюда же:

есть скажем переменная A

export A='aaaaaaa[000]bbbbbbb'

нужно вырезать скажем все после [, можно сделать так:

echo ${A} | sed 's/\[.*//g'

а можно встроенными средствами bash что намного быстрей:

echo ${A/\[*/}

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