awkのグループ化と「削減」

awkのグループ化と「削減」

次のようなデータがあるとしましょう。

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"] |
.

によって評価されると、jqJSON文書が生成されます。

{
  "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

おすすめ記事