次のようなデータがあるとしましょう。
table_name id
table_name col_1
table_name col_2
another_table_name id
another_table_name col_1
最初の列を使用してグループ化awk
し、2番目の列をカンマ区切りリストに減らすにはどうすればよいですか?例によると、出力は次のようになります。
table_name id,col_1,col_2
another_table_name id,col_1
ここでのアイデアは、2番目の列を使用して、jq
最初の列(キー)のデータに基づいてJSON配列(値)を設定できることです。
{"table_name": ["id", "col_1", "col_2"]}
{"another_table_name": ["id", "col_1"]}
grrouby / "reduce"ステップを除いて、すべてがうまく機能します。どうぞよろしくお願いします!
ベストアンサー1
JSON構造を生成する最も簡単なオプションは、次のものを使用することです。jo
ユーティリティ:
$ sed 's/[[:blank:]]\{1,\}/[]=/' file | jo -p
{
"table_name": [
"id",
"col_1",
"col_2"
],
"another_table_name": [
"id",
"col_1"
]
}
sed
スクリプトは、最初のスペースまたはタブのセットを 。サンプルデータに基づいて、次の結果が得られます。jo
[]=
table_name[]=id
table_name[]=col_1
table_name[]=col_2
another_table_name[]=id
another_table_name[]=col_1
その後、jo
ユーティリティはデータを正しくエンコードし、JSONドキュメントを生成することを担当します。コンパクトな出力が必要な場合は、-p
オプションを削除してください。jo
以前の答えはjq
代替を使用しますが、JSONエンコードが必要なデータを処理しません。
データに特別なJSONエンコーディングが必要ないとします。
jq -n "$(awk '{ printf ".\"%s\" += [\"%s\"] |\n", $1, $2 } END { print "." }' file)"
または
awk '{ printf ".\"%s\" += [\"%s\"] |\n", $1, $2 } END { print "." }' file |
jq -n -f /dev/stdin
awk
これは、配列を作成する式を作成するために使用されますjq
。与えられたサンプルデータの式jq
は次のとおりです。
."table_name" += ["id"] |
."table_name" += ["col_1"] |
."table_name" += ["col_2"] |
."another_table_name" += ["id"] |
."another_table_name" += ["col_1"] |
.
によって評価されると、jq
JSON文書が生成されます。
{
"table_name": [
"id",
"col_1",
"col_2"
],
"another_table_name": [
"id",
"col_1"
]
}
-c
コンパクト出力オプションが追加されましたjq
。
sed
代わりに使用してくださいawk
:
sed -e 's/\([^[:blank:]]*\)[[:blank:]]*\(.*\)/."\1" += ["\2"] |/' \
-e '$ s/$/./' file |
jq -n -f /dev/stdin