存在する値に応じて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以外の値に設定したいと思いますSeverity
。abc_severity
nullまたは空の場合に設定し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つのキーがすべて存在しますが、その値は 。null
false
null
null
null
null 値を引き続き使用すると、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つの値がすべての場合は空の文字列を選択します。null
n
null
データを使用してコマンドラインで上記の内容をテストします。
$ 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"
}