首页 > 解决方案 > jq:如何在其他字段中使用相同的搜索而不重复代码?

问题描述

我有这个 jq 命令:

cat myfile | jq  -c '{ 
    domain: .name, 
    results: .data | select(.answers != null) | .answers | map(.answer) | del(.[] | nulls) , 
    includes: .data | select(.answers != null) | .answers | map(.answer) | del(.[] | nulls) | map(match("rearch:(.*?)?[ \"]"; "ig").captures[0].string) | unique
    }'

得到这个结果:

{"domain":"blabla.com","results":["dorem rearch:blble.k iyh"],"includes":["blble.k"]}
{"domain":"bla.com","results":["koa rearch:ble.m","kl rearch:be.c lk"],"includes":["ble.m","be.c"]}

我的问题DRY是:我的命令有什么办法吗?
我的意思是如何在不重复部分的情况下获得相同的结果

.数据 | 选择(.answers != null) | .答案 | 地图(.answer) | 德尔(.[] | 空值)

我怎样才能重用resultsfeild 的结果?
我有一个非常大的文件要处理,所以我不想浪费时间和资源。

标签: jsonduplicatesfieldjq

解决方案


有一个变量

< myfile.json jq  -c '
  (.data | select(.answers != null) | .answers | map(.answer) | del(.[] | nulls)) as $data
  | { 
    domain: .name, 
    results: $data,
    includes: $data | map(match("rearch:(.*?)?[ \"]"; "ig").captures[0].string) | unique
    }
'

没有变量

< myfile.json jq  -c '
  { domain: .name, 
    results: (.data | select(.answers != null) | .answers | map(.answer) | del(.[] | nulls)) }
  | .includes = (.results | map(match("rearch:(.*?)?[ \"]"; "ig").captures[0].string) | unique)
'

推荐阅读