根据另一个键的特定值获取特定键的所有值

Get all values of a specific key based on another key specific value

我有一个超过 100 万行的 jsonlines 格式文件(比方说 BIG.json)。我想根据一些 key/value 依赖项(如下所述)过滤此文件。

当然,所有行的结构都是一样的,这里是这个文件的连续 5 行:

{"filename": "ppc/1989-1991/senat/posiedzenia/pp/198991-snt-ppxxx-00017-01/text_structure.xml", "period": "1989-1991", "title": "17 posiedzenie Senatu PRL/RP", "date": "1990-01-19", "person": "Senator Andrzej Szczypiorski", "txt_id": "u-59.4", "txt": "Rzeczpospolita Polska powraca do zasad demokratycznych, a zatem po bez mała 60 latach znów będziemy mieli w naszym kraju samorząd terytorialny. A bez niego wszelkie dysputy o demokracji, o państwie obywatelskim i o suwerenności społeczeństwa pozostałyby pustym gadulstwem."}
{"filename": "ppc/1989-1991/senat/posiedzenia/pp/198991-snt-ppxxx-00017-01/text_structure.xml", "period": "1989-1991", "title": "17 posiedzenie Senatu PRL/RP", "date": "1990-01-19", "person": "Senator Andrzej Szczypiorski", "txt_id": "u-59.5", "txt": "Powiedziałem, że Polska wraca do zasady samorządności gmin po bez mała 60 latach i to jest oczywista prawda, bo przed wybuchem wojny w roku 1939, już od połowy lat trzydziestych, samorząd terytorialny w ówczesnym państwie polskim był znacznie ograniczony i poddawany coraz surowszej kontroli administracji rządowej. Z takim szacunkiem i czcią wspominany dzisiaj przez nas prezydent m. st. Warszawy, człowiek wielkich zasług i wielkiego męstwa, Stefan Starzyński, nie był przecież prezydentem Warszawy z wyboru, był prezydentem komisarycznym, bo po roku 1934 samorząd terytorialny w Warszawie już praktycznie nie funkcjonował w sposób prawdziwie demokratyczny."}
{"filename": "ppc/1989-1991/senat/posiedzenia/pp/198991-snt-ppxxx-00017-01/text_structure.xml", "period": "1989-1991", "title": "17 posiedzenie Senatu PRL/RP", "date": "1990-01-19", "person": "Senator Andrzej Szczypiorski", "txt_id": "u-59.6", "txt": "Stąd właśnie dzisiejsze zetknięcie się z tą problematyką jest niejako pierwszym spotkaniem Polaków z samorządnością. Już niemal nikt nie może pamiętać tych spraw z osobistego doświadczenia. Ostatni żyjący dzisiaj jeszcze radni gmin i miast z tamtej epoki są starcami, a przez wszystkie minione lata uczyniono wielki wysiłek, aby sprawy samorządu terytorialnego z ludzkiej pamięci wymazać, a wyobrażenia o samorządzie gruntownie zafałszować."}
{"filename": "ppc/1989-1991/senat/posiedzenia/pp/198991-snt-ppxxx-00017-01/text_structure.xml", "period": "1989-1991", "title": "17 posiedzenie Senatu PRL/RP", "date": "1990-01-19", "person": "Senator Andrzej Szczypiorski", "txt_id": "u-59.7", "txt": "O cóż idzie w kwestii samorządu terytorialnego i na czym polega cała sprawa z punktu widzenia filozofii demokratycznego państwa? Idzie po prostu o to, aby obywatele tego państwa wzięli w swoje ręce odpowiedzialność za los zbiorowy. Idzie o to, aby gmina, to znaczy określone terytorium, na którym mieszka określona liczba mieszkańców i na którym znajdują się określone urządzenia użyteczności publicznej, sama decydowała o swoim losie, o swoich zamiarach, o planach swego rozwoju, o najwłaściwszym wykorzystaniu duchowych i materialnych sił lokalnej społeczności."}
{"filename": "ppc/1989-1991/senat/posiedzenia/pp/198991-snt-ppxxx-00017-01/text_structure.xml", "period": "1989-1991", "title": "17 posiedzenie Senatu PRL/RP", "date": "1990-01-19", "person": "Senator Andrzej Szczypiorski", "txt_id": "u-59.8", "txt": "Jest to zmiana rewolucyjna, ponieważ wymaga od milionów ludzi zupełnie nowych zachowań i zupełnie nowego stosunku do życia publicznego. Przez. kilka dziesięcioleci obywatel PRL przywykł, że wszechobecne państwo i jego aparat urzędniczy decydowało niemal o wszystkim. Obywatel PRL mieszkał w państwowym mieszkaniu, kupował w państwowym sklepie państwowy chleb i państwowe mleko, pracował na państwowej posadzie, spał na państwowym łóżku i mogło się zdawać, że oddycha państwowym powietrzem. Niemal wszystko pozostawało w gestii państwa, a obywatel nie był podmiotem życia publicznego, ale przedmiotem wszechobecnej manipulacji."}
{"filename": "ppc/1989-1991/senat/posiedzenia/pp/198991-snt-ppxxx-00017-01/text_structure.xml", "period": "1989-1991", "title": "17 posiedzenie Senatu PRL/RP", "date": "1990-01-19", "person": "Senator Andrzej Szczypiorski", "txt_id": "u-59.9", "txt": "Towarzyszyło nam, i to zrozumiałe, poczucie zniewolenia, wyobcowania i kompletnej bezradności, a także jako naturalna reakcja na taki stan rzeczy, obojętność na sprawy publiczne, lekceważenie własności, która była w gruncie rzeczy niczyja, oraz niechętny lub zgoła wrogi i pełen wzgardy stosunek do każdego urzędu. Obywatel, który czuł się nieustannie wyzyskiwany i oszukiwany przez aparat państwa usiłował w swojej bezbronności i bez radności oszukiwać państwo, trwonić wspólny majątek i lekceważyć przepisy prawa."}

这个文件是解析多个XML个文件并从中提取数据的结果。

我想根据 "person" 键值过滤一些行,并将它们放入另一个 jsonlines 文件,最好与 "person" 键值同名。例如,名为 "Senator Andrzej Szczypiorski.json" 的文件应包含 BIG.json 的每一行,这些行在 "person" 键下具有恰好 "Senator Andrzej Szczypiorski" 的值。

假设您的输入文件是 input.txt,试试这个命令:

jq 'select(.filename=="path_to_file2" and (.date | contains("2016-10-")))' input.txt

调整条件以满足您的需要。使用 == 进行精确匹配,使用 contains(element) 进行子字符串匹配。

为了获得另一个 jsonlines 文件作为输出,在 JQ 脚本之前添加 -c(紧凑输出)标志。您还应该将输出重定向到一个新文件:

jq -c 'select(.filename=="path_to_file2" and .date=="2016-10-22")' input.txt > output.txt