использовать find
и tree
команда, которая является находкой использования prune
исключить каталоги поиска и использования tree -P
для поиска шаблона.
Используйте переключатель чернослива, например, если Вы хотите исключить misc
каталог просто добавляет a -path ./misc -prune -o
к Вашей команде находки.
для, например.find . -path ./misc -prune -o -exec tree -P <pattern> {} \;
или можно использовать -name "*.cpp" in find
поскольку, исключая нескольких использование каталогов
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o
Я думаю, что нашел этот ответ в другом вопросе о StackOverflow, но я нашел "q" довольно полезный с этой целью: https://github.com/harelba/q.
Например, Ваша цель в качестве примера была бы достижима как этот:
$ q "select c2, sum(c3) from data group by c2"
u1 423404
u2 3948
И так как это использует sqlite в качестве бэкенда, можно использовать все виды функций sqlite для создания вычислений.
С некоторыми ограничениями GNU Recutils может сделать это. Во-первых, это должен быть файл CSV, не TSV (Recutils, кажется, не нравятся файлы TSV), и нуждается в заголовке. Но затем я могу сделать:
csv2rec foo.csv |recsel -G user -p 'user,sum(size)' |rec2csv
Не уверенный, если это лучше или хуже, чем острота Perl или Awk.
Если однострочники awk не считаются, возможно, вам понравится следующая однострочная оболочка (bash / ksh):
sort -k2 data | ( while read c1 c2 c3; do if [ "$prev" = "$c2" ]; then
sum=$(expr $c3 + $sum); else if [ $prev ]; then echo $prev $sum; fi;
sum=$c3; prev=$c2; fi; done; echo $prev $sum)
Помимо sort
и expr
(для группировки и суммирования соответственно) интересным ингредиентом, используемым здесь, является оператор чтения внутри while. И круглые скобки, которые создают подпроцесс, необходимый для локализации переменных $ prev
и $ sum
.