このjsonを変換できますか?
[
{
"bytes": 276697,
"checked": false
},
{
"bytes": 276697,
"checked": false
}
]
jqにヘッダーがあるテーブルとして?
私は試した:
cat file.json | jq '.[] | join(",")'
しかし、ヘッダーは省略されました。
"276697,false"
"276697,false"
それが必要です:
"bytes,checked"
"276697,false"
"276697,false"
2つのコマンドだけを実行してみてください。
cat file.json | jq '.[] | keys, .[] | join(",")'
しかし、2番目は失敗します。
"bytes,checked"
jq: error (at <stdin>:64): Cannot iterate over null (null)
理想的にはこれ。
答え1
リストの最初の要素のキーからタイトルを文字列配列として選択し、すべての要素の値を別々の配列に抽出できます。@csv
結果リストの各要素に出力演算子を適用すると、CSV形式のデータが参照されます(jq
すべての文字列、ブール値または数値を除く)。
$ jq -r '[first|keys] + map([.[]]) | .[] | @csv' file
"bytes","checked"
276697,false
276697,false
または、
$ jq -r '(first|keys), (.[]|[.[]]) | @csv' file
"bytes","checked"
276697,false
276697,false
または、
$ jq -r '(first|keys), map(map(.))[] | @csv' file
"bytes","checked"
276697,false
276697,false
あるいは、値を別々の配列に抽出する別の方法。
これは、入力データ全体で同じ順序で表示されるキーに依存することに注意してください。
しかし、使いやすくなります。ミラー( mlr
):
$ mlr --j2c cat file
bytes,checked
276697,false
276697,false
これは単にMillerのコマンドを介してデータを渡すと同時にcat
(この方法ではデータは変更されません)オプション--j2c
(略語--ijson --ocsv
)を使用してデータをJSONからCSVに変換します。 MillerはCSVを正しく認識するため、実際に参照する必要があるフィールドのみを参照します。
次のコマンドを使用してきれいな印刷出力形式を選択して、正しい形式のテーブルを取得することもできます--barred
。
$ mlr --j2p --barred cat file
+--------+---------+
| bytes | checked |
+--------+---------+
| 276697 | false |
| 276697 | false |
+--------+---------+
(--j2p
yesの略語です--ijson --opprint
。)
または--barred
:
$ mlr --j2p cat file
bytes checked
276697 false
276697 false
答え2
わかりました:
cat file.json | jq '(.[0] | keys), .[] | join(",")'
ストリームを「消費」するのを防ぐために、括弧内にどの部分でも入れることができるようです(これが名前なのかjqドキュメントに何も見つからないのでここに持って来るのかはわかりません。そしてそこに様々なブログやスタックオーバーフローに散らばっている部分ですべてをまとめる作業が必要なので、これを行うための「正しい」方法がある場合はお知らせください。
ところで、私と同じシェルforループがある場合は、-sオプションを使用して別のjsonオブジェクトを結合します。
$ for i in {3,4,5,8}
do rclone rc core/stats --rc-user USER --rc-pass PASS --rc-addr :557$i
done | jq -rs '(.[0] | keys), .[] | join(",")' | column -ts,
bytes checks deletedDirs deletes elapsedTime errors eta fatalError renames retryError speed totalBytes totalChecks totalTransfers transferTime transfers
1660182 0 0 0 258038.009782457 0 0 false 0 false 1664.9322505627426 1660182 0 6 0 6
407752609 0 0 0 258038.054874325 0 0 false 0 false 10615.04533495996 407752609 0 86 0 86
7403585 0 0 0 258038.103563555 0 0 false 0 false 20892.381593377457 7403585 0 2 0 2
0 0 0 0 258038.156466825 0 false 0 false 0 0 0 0 0 0