О применении команд к группам строк из stdin

Просто измените окончательную готовую на готовую | sort -nr

Это сортирует вывод цикла for через конвейер и не требует временных файлов.

3
19.03.2016, 01:49
2 ответа

По-моему, это не похоже на работу для shell. Я бы сделал это на perl/python/ruby... хотя здесь awk может быть достаточно:

$ cat sum
paste -sd + - | bc
$ sort -t , -k 1,1 input | awk -F, -v cmd=./sum '
   function out() {printf "%s,", l;close(cmd)}
   NR>1 && $1 != l {out()}
   {print $2 | cmd; l=$1}
   END {if (NR) out()}'
1,15
2,20
2
27.01.2020, 21:22

Если я понял, что вы ищете: скрипт, аналогичный тем, что создают дистрибутив из набора образцов, но с большим количеством опций накопления. Я написал awk скрипт для этого.

https://drive.google.com/open?id=0B0Kg_QLltwbNU21zbHFMY1hnSjQ

Это не совсем то, что вы хотите, но совпадение должно быть значительным. Во-первых - индексы могут быть не только целочисленными, во-вторых - единственным методом накопления является суммирование. Но поскольку это просто скрипт, вы можете модифицировать его по своему усмотрению легче, чем, скажем, программу на Си.

Наконец, такие скрипты применимы только в том случае, если набор данных достаточно мал, для больших наборов они слишком медленны! Поэтому предпочтительнее использовать более специализированный пакет (R и т.д.).

P.S. Чтобы добавить другие аккумуляторы, замените += на пользовательскую функцию (а-ля "монада").

1
27.01.2020, 21:22

Теги

Похожие вопросы