Необходим только один вызов jq. Чтобы выделить выходные данные для отдельных файлов, вы можете объединить этот один вызов с одним вызовом для awk или использовать цикл оболочки, как показано ниже.
Во-первых, вот иллюстрация того, как будет выглядеть конвейер оболочки:
jq -r --rawfile dd2name dd2name.tsv -f group.jq input.json |
while IFS= Это предполагает, что отображение имен файлов находится в файле TSV с именем dd2name.tsv, и что следующая программа jq находится в group.jq:
def dict:
split("\n") | map(select(length>0) | split("\t"))
| INDEX(.[0]) | map_values(.[1]);
($dd2name | dict) as $dict
| ($dict | keys_unsorted[]) as $dd
| map(select(.dd == $dd))
| group_by(.jlo)
| map("\($dict[$dd])\t\(.[0].jlo) \(length)")[]
Как следует из названия, функция dict
создает словарь, дающий сопоставление значений .dd с именами файлов. Предполагается наличие INDEX
. Если у вашего jq нет INDEX
, то сейчас самое время обновить ваш jq; в противном случае его def можно легко скопировать из buildin.jq (google: builtin.jq "def INDEX"
), или вы можете заменить последнюю строку на: | reduce .[] as $p ({}; .[$p[0]] = $p[1]);
решение на основе awk
Вызов awk можно использовать вместо приведенной выше команды while ... done
:
awk -F\\t 'fn && (fn!=$1) {close(fn)}; {fn=$1; print $2 >> fn}'
Сезон по вкусу
Если файл отображения dd2name.tsv не содержит суффикс ".txt", он может быть легко добавлен любым из множества способов, в зависимости от вкуса.
Отметим также, что предложенные решения выше делают некоторые предположения, в частности, что значения .jlo не содержат табуляции, новых строк или NUL. Если какое-либо из этих предположений будет нарушено, потребуется некоторая настройка.
\t' read -r f v ; do echo "$v" >> "$f" ; done
Это предполагает, что отображение имен файлов находится в файле TSV с именем dd2name.tsv, и что следующая программа jq находится в group.jq:
def dict:
split("\n") | map(select(length>0) | split("\t"))
| INDEX(.[0]) | map_values(.[1]);
($dd2name | dict) as $dict
| ($dict | keys_unsorted[]) as $dd
| map(select(.dd == $dd))
| group_by(.jlo)
| map("\($dict[$dd])\t\(.[0].jlo) \(length)")[]
Как следует из названия, функция dict
создает словарь, дающий сопоставление значений .dd с именами файлов. Предполагается наличие INDEX
. Если у вашего jq нет INDEX
, то сейчас самое время обновить ваш jq; в противном случае его def можно легко скопировать из buildin.jq (google: builtin.jq "def INDEX"
), или вы можете заменить последнюю строку на: | reduce .[] as $p ({}; .[$p[0]] = $p[1]);
Вызов awk можно использовать вместо приведенной выше команды while ... done
:
awk -F\\t 'fn && (fn!=$1) {close(fn)}; {fn=$1; print $2 >> fn}'
Если файл отображения dd2name.tsv не содержит суффикс ".txt", он может быть легко добавлен любым из множества способов, в зависимости от вкуса.
Отметим также, что предложенные решения выше делают некоторые предположения, в частности, что значения .jlo не содержат табуляции, новых строк или NUL. Если какое-либо из этих предположений будет нарушено, потребуется некоторая настройка.
Если Вы означаете делать агрегирование, можно использовать функции агрегирования ORM:
from django.db.models import Count
Members.objects.values('designation').annotate(dcount=Count('designation'))
Это приводит к запросу, подобному
SELECT designation, COUNT(designation) AS dcount
FROM members GROUP BY designation
, и вывод имел бы форму
[{'designation': 'Salesman', 'dcount': 2},
{'designation': 'Manager', 'dcount': 2}]
Легкое решение, но не надлежащий путь состоит в том, чтобы использовать необработанный SQL:
results = Members.objects.raw('SELECT * FROM myapp_members GROUP BY designation')
Другое решение состоит в том, чтобы использовать group_by
свойство:
query = Members.objects.all().query
query.group_by = ['designation']
results = QuerySet(query=query, model=Members)
можно теперь выполнить итерации по переменной результатов для получения результатов. Обратите внимание, что group_by
не документируется и может быть изменен в будущей версии Django.
И... почему Вы хотите использовать group_by
? Если Вы не используете агрегирование, можно использовать order_by
для достижения подобного результат.
Необходимо сделать пользовательский SQL, как иллюстрируется этим отрывком:
Пользовательский SQL через подзапрос
Или в пользовательском менеджере как показано в документах Django онлайн: