JQ включить результаты фильтра внутри нового фильтра - PullRequest
1 голос
/ 07 февраля 2020

Я хочу использовать результаты фильтра jq внутри другого фильтра jq. Я сделал это с xargs, но я чувствую, что это должен быть лучший способ с простым jq прогоном.

Пример:

]$ cat test.json 
{
   "prof" : {
      "Sma00K279a" : {
         "SMLT_RS00075" : {
            "Sma00K279a" : {
               "SMLT_RS00075" : 1.0
            }
         },
         "SMLT_RS00180#" : {
            "Sma00K279a" : {
               "SMLT_RS00180#" : 1.0
            }
         },
         "Smlt0558" : {
            "Sma00K279a" : {
               "Smlt3938" : 1.0
            }
         }
      }
   },
   "redundant_removed" : {
      "Sma00K279a" : {
         "SMLT_RS22460" : "SMLT_RS22690",
         "Smlt0558" : "Smlt3938",
         "Smlt3573" : "Smlt1093"
      }
   }
}

Мое решение:

]$ jq '.redundant_removed.Sma00K279a|keys[]' test.json |tr -d \"|xargs -tI% jq '.prof.Sma00K279a.%' test.json 
jq .prof.Sma00K279a.SMLT_RS22460 test.json 
null
jq .prof.Sma00K279a.Smlt0558 test.json 
{
  "Sma00K279a": {
    "Smlt3938": 1
  }
}
jq .prof.Sma00K279a.Smlt3573 test.json 
null

Мой вопрос:

Есть ли лучший способ сделать это с одним jq бежать?

1 Ответ

3 голосов
/ 07 февраля 2020

Конечно, есть.

$ jq '.prof.Sma00K279a[.redundant_removed.Sma00K279a|keys[]]' file
null
{
  "Sma00K279a": {
    "Smlt3938": 1
  }
}
null

Или немного более обобщенно c one:

$ jq '(.prof|keys[]) as $k | .prof[$k][.redundant_removed[$k]|keys[]]' file
null
{
  "Sma00K279a": {
    "Smlt3938": 1
  }
}
null
...