LINUX.ORG.RU

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


0

1

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

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

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

★★★★

1 в конце это ответ, изначально он был на другой строке)

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

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

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

егодня выяснилось что awk отъедает то-же очень и очень не мало...

странно, у меня на удивление разница с cut была небольшая. Ну может раза в полтора... Может дело в том что он часто дёргается?

true_admin ★★★★★
()

Кстати, никто даже не поинтересовался, какая реализация awk используется.

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

странно, у меня на удивление разница с cut была небольшая. Ну может раза в полтора... Может дело в том что он часто дёргается?

часто, выдираются значения многих столбцов, я переписал вообще на read - разница в сотни если не в тысячи раз, но все равно интересны другие варианты

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

echo ' 3 2 1 '| grep -o '[^ ]*' | tail -1

подобное первым делом в голову пришло)

quest ★★★★
() автор топика

echo «1 2 3 4» | { read a b c d ; echo $c ; }

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

Ещё в bash есть массивы

a=( $( echo 1 2 3 ) ) ; echo ${a[2]}

Очень много отъедает fork. Но, в целом, если уж писать обработку текста, то лучше вобще целиком на awk, он умеет запускать процессы и обрабатывать их вывод не хуже bash'а.

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

Смутно помню тот топик. Но упомянать в одном треде питон и перл как то флеймообразующе :-)

mky ★★★★★
()

awk для этого слишком тяжел... предложите плиз замену!

assembler

anonymous
()
eval array=(`echo "1 2 3"`)
echo ${array[2]}
ananas ★★★★★
()
Ответ на: комментарий от invy

А на чём awk написан? На вижуалбэйсике что-ли?

на С. но он работает с записями, там довольно сложный парсинг этих записей, намного замороченнее, чем в sed (которая умеет только строки символов, разделённые \n). read иногда даже быстрее получается, т.к. это встроенная в bash команда, а вызов внешних утилит в bash очень дорогой.

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

В ТС было «echo» поэтому и в моём примере «echo», чтобы показать, как в массив заносится результат выполнения команды.

Массивы торозные, но, вроде, быстрее чем запуск awk.

но в данном случае это в основном скрипты обработки выхлопа баз данных и база это то во что они упираются

Подозреваю, что быстрее всего будет формировать результаты SQL-запросами :-)

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

оно понятно, но в данном случае это в основном скрипты обработки выхлопа баз данных и база это то во что они упираются, но сегодня выяснилось что awk отъедает то-же очень и очень не мало

скрипт скрипту рознь, прежде чем хаять awk, стоит обнародовать свои наработки и помедитировать на циферки в тестах http://brenocon.com/blog/2009/09/dont-mawk-awk-the-fastest-and-most-elegant-b...

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

нет, не понел, просвети, а?
автор привёл все исходники, так что можешь не жалеть меня, а прям с указанием номера строки резать правду-матку

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

странно, у меня на удивление разница с cut была небольшая. Ну может раза в полтора...

В полтора раза - это небольшая разница?!

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

В полтора раза - это небольшая разница?!

а всё равно было слишком тормозно.

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

В полтора раза - это небольшая разница?!

Все зависит от ситуации, в данном случае, насколько я понял, интересны разы, а лучше десятки раз.

anonymous
()

но сегодня выяснилось что awk для этого слишком тяжел...

это если его на каждую строку вызывать. а можно написать awk-скрипт, который всё будет делать.

Adjkru ★★★★★
()

Используй то к чему привык+удобно. Сам использую для подобных целей sed, иногда cut.

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

Подозреваю, что быстрее всего будет формировать результаты SQL-запросами :-)

согласен.

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

нет, не понел, просвети, а?

это не тест awk vs c++, а тест awk vs hash_map. И вообще, тест - чистой воды синтетика, и не имеет отношения к IRL.

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

Кстати, никто даже не поинтересовался, какая реализация awk используется.

скорее всего gawk. но в данном тесте вряд ли mawk сделает gawk.

ЗЫЖ вот этот вариант будет наверняка быстрее *awk, причём скорее всего на порядок:

$ echo '1 2 3' | sed 's/.* //'
3
правда он выделяет только последнее поле. можно и не последнее, хотя выигрыш в скорости будет меньше. Однако скорее всего будет.

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

наш разговор безпредметен, и все эти теоритезирования представляют чисто академический интерес, и повод поморщить умное лицо, ведь мы ничего не знаем о конкретной реализации ТС
может он в цикле по 100 форков на итерацию наделал

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

наш разговор безпредметен, и все эти теоритезирования представляют чисто академический интерес

привет, кэп! но что делать, если пошли такие ТСы, а телепатов как не было, так и нет?

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

что делать

задай этот вопрос своему сердцу, брат.

Я на самом деле не знаю, когда единичный вызов awk становится выгоднее множественных вызовов sed/echo
Док, можешь свой пример «echo '1 2 3' | sed 's/.* //' изобразить для файла в 100 000 строк?

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

zolden

Я на самом деле не знаю, когда единичный вызов awk становится выгоднее множественных вызовов sed/echo

кто говорил о _множественном_ вызове sed/echo? В моём примере всего _один_ вызов sed. Над файлом /dev/stdin. Echo тут просто для того, что-бы видно было, что в этом файле.

zolden

Док, можешь свой пример «echo '1 2 3' | sed 's/.* //' изобразить для файла в 100 000 строк?
z

а что надо получить? Вообще:

sed 'какой_то_скрипт' файл_в_100000_строк.txt
я говорил о том, что это обычно на порядок быстрее, чем
awk 'эквивалентный_скрипт' файл_в_100000_строк.txt
при соблюдении следующих условий:
1. никакой арифметики. В смысле, что sed может найти третий столбец, но _именно_ третий. Даже деление пополам строки в N символов для sed требует цикла, который выполняется N/2 раз. А вот awk может просто посчитать N/2.
2. только строчки. Т.е. мы работаем исключительно с последовательностью символов, которые разделены символом \n.

ЗЫЖ кстати, создателю вышеупомянутого теста, а также всем дроч^Wмедитирующим на mawk следует учесть, что эта mawk не умеет utf-8, за счёт чего работает быстрее во много раз. Но считает 'ф' двумя символами. В отличие от gawk, которая понимает русский язык.

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

насколько я понял, интересны разы, а лучше десятки раз

read дает сотни если не тысячи раз, я пока остановился на нем, всем спасибо!

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

# time sed 's/.* //' test.txt > /dev/null
real 0m0.037s
user 0m0.032s
sys 0m0.000s
# time awk '{print $3}' test.txt > /dev/null
real 0m0.020s
user 0m0.008s
sys 0m0.004s
# wc -l test.txt
34782 test.txt

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