我在容器中存储了以下JSON记录
class WebsiteUser(HttpLocust):
def setup(self):
client = clients.HttpSession(base_url=self.host)
client.post("/resources/", json=RESOURCE_1, headers=headers_with_auth)
task_set = UserBehavior
min_wait = 500
max_wait = 900
我正在检查是否有memberId的任何重复-理想情况下返回true / false,然后还返回重复的值。
所需的输出:
{"memberId":"123","city":"New York"}
{"memberId":"234","city":"Chicago"}
{"memberId":"345","city":"San Francisco"}
{"memberId":"123","city":"New York"}
{"memberId":"345","city":"San Francisco"}
答案 0 :(得分:1)
这是使用inputs
的有效方法。它需要使用-n命令行选项调用jq。这个想法是创建一个字典来保存每个memberId字符串值的计数。
可以如下创建字典:
reduce (inputs|.memberId|tostring) as $id ({}; .[$id] += 1)
因此,要生成一个真/假指示符,如果有重复项,则跟着重复项,您可以编写:
reduce (inputs|.memberId|tostring) as $id ({}; .[$id] += 1)
| to_entries
| map(select(.value > 1))
| (length > 0), .[].key
(如果已知所有.memberId值都是字符串,那么当然可以放弃对tostring
的调用。相反,如果.memberId既是字符串又是整数值,则上述程序将不会t区分1
和"1"
的出现。)
上述字典有时被称为“单词袋”(https://en.wikipedia.org/wiki/Bag-of-words_model)。这导致了通用功能:
def bow(stream):
reduce stream as $word ({}; .[($word|tostring)] += 1);
现在可以更加简洁地编写解决方案:
bow(inputs.memberId)
| to_entries
| map(select(.value > 1))
| (length > 0), .[].key
对于只有重复的值,可以编写更有效的查询:
bow(inputs.memberId)
| keys_unsorted[] as $k
| select(.[$k] > 1)
| $k