jq - 条件付きの値を別の値に設定する

jq - 条件付きの値を別の値に設定する

存在する値に応じてjsonドキュメントのフィールド値を3つの値のいずれかに設定するには、jqを使用する必要があります。理論的にはこれは次のとおりですset X to (if A exists, else if B exists, else if C exists, else "")

私のjsonドキュメントの例は次のとおりです。

{
  "name": "0230",
  "publish_date": "2007-08-18",
  "abc_severity": "",
  "def_severity": "medium",
  "ghi_severity": "negligible"
}

フィールドを作成し、その値をnullまたはnull以外の値に設定したいと思いますSeverityabc_severitynullまたは空の場合に設定しdef_severity、nullまたは空の場合に設定したいと思いますghi_severity。 3つすべてがnullまたは空の場合は、null値を使用して生成できます""。したがって、この場合の出力は次のようになります。

{
  "name": "0230",
  "publish_date": "2007-08-18",
  "abc_severity": "",
  "def_severity": "medium",
  "ghi_severity": "negligible",
  "Severity": "medium"
}

私が得ることができる最も近いものは次のとおりです。

'. | if .abc_severity? then .Severity=.abc_severity else if .def_severity? then .Severity=.def_severity else if .ghi_severity? then .Severity=.ghi_severity else .Severity="" end end end'

ただし、1つ以上の他の値が存在しても、の値はSeverity常にです。""私はここで簡単なことを見落としていて、それを見つけることができないようだと確信しています。

ベストアンサー1

空の文字列はまだ文字列なので(または).abc_severity?代わりに空の文字列を提供します。また、疑問符はおよそ「このキーが存在しない場合は置換」を意味します。この例では、3つのキーがすべて存在しますが、その値は 。nullfalsenullnull

nullnull 値を引き続き使用すると、jq式は次のようになります。

.Severity = (.abc_severity // .def_severity // .ghi_severity )

上記の式は、3つの値のうちではない最初の値を選択しnull、一番左の値を最初にテストしてから右に移動するか、nullすべての場合ですnull。しかし、今は空の文字列を処理する必要があるため動作しません。まるで彼らはnull

ヘルパー関数を導入して(入力を減らすために)これを行うことができます。

def n: if . == "" then null else . end;
.Severity = ((.abc_severity|n) // (.def_severity|n) // (.ghi_severity|n) // "")

文字列が空でない場合、ヘルパー関数はn文字列をそのまま返し、そうでなければを返しますnull。チェーン演算子の場合(ピボット時)//ではなく、3つの値のうち最初の値を選択するか、3つの値がすべての場合は空の文字列を選択します。nullnnull

データを使用してコマンドラインで上記の内容をテストします。

$ jq 'def n: if . == "" then null else . end; .Severity = ((.abc_severity|n) // (.def_severity|n) // (.ghi_severity|n) // "")' file
{
  "name": "0230",
  "publish_date": "2007-08-18",
  "abc_severity": "",
  "def_severity": "medium",
  "ghi_severity": "negligible",
  "Severity": "medium"
}

おすすめ記事