私は bash スクリプトの初心者です。複数の json ファイルを結合するスクリプトを書こうとしました。例:
ファイル1:
{
"file1": {
"foo": "bar"
}
}
ファイル2:
{
"file1": {
"lorem": "ipsum"
}
}
結合されたファイル:
{
"file1": {
"foo": "bar"
},
"file2": {
"lorem": "ipsum"
}
}
私が思いついたのはこれです:
awk 'BEGIN{print "{"} FNR > 1 && last_file == FILENAME {print line} FNR == 1 {line = ""} FNR==1 && FNR != NR {printf ","} FNR > 1 {line = $0} {last_file = FILENAME} END{print "}"}' json_files/* > json_files/all_merged.json
うまく動作しますが、もっと良い方法があると思います。何かアイデアはありますか?
ベストアンサー1
awkでJSONを扱うのは、あまり良い考えではありません。意味のない空白を勝手に変更すると、コードが壊れてしまいます。代わりに、jq
; これはこのような目的のために作られています。 2 つのオブジェクトを結合するには、*
2 つのファイルに対して演算子を使用します。
jq -s '.[0] * .[1]' file1.json file2.json
任意の数のファイルの場合は、reduce
を使用してすべてに順番に適用します。
jq -s 'reduce .[] as $item ({}; . * $item)' json_files/*
この-s
スイッチにより、jq
JSON ファイルの内容を、処理する前に大きな配列に読み込むことができます。