jqでソートせずに一意にする

jqでソートせずに一意にする

配列=>["cross", "base", "cross", "dunk"]

ソートせずに重複した値をすべて削除したいです。

注文する:jq '. | unique' file.json

出力:["base", "cross", "dunk"]

予想出力:["cross", "base", "dunk"]

ベストアンサー1

map({key:.,value:1})|from_entries|keys_unsorted

代わりにunique実現可能に見えます。

map配列を次に変換します。

[{"key":"cross","value":1},{"key":"base","value":1},{"key":"cross","value":1},{"key":"dunk","value":1}]

from_entries次に変更してください。

{"cross":1,"base":1,"dunk":1}

オブジェクトの2つの要素は同じキーを持つことができないため、この時点で重複した要素は削除されます。

keys_unsortedオブジェクトのキーを元の順序で返します。

同じ原則に従うより短くて簡単な選択肢:

map({(.):1})|add|keys_unsorted

または、次のようなより一般的なプログラミング言語を使用できますperl

perl -l -0777 -MJSON::PP -MList::Util=uniq -pe '
  $_ = encode_json[uniq @{decode_json $_}]' array.json

-p式が機能するように各レコードを取得array.jsonする sed モードです。$_e

-0777レコード区切り文字を不可能な値に設定します。つまり、1つのレコードだけが完全なファイルであることを意味します(-g最新バージョンのobbleを参照perl)。

decode_json $_レコードをデコードし、配列参照を返し、@{...}リストをに渡しuniq[...]結果を別の配列参照に渡しencode_json、結果を印刷します$_(後に改行文字が続きます-l)。

Perl用のJSONプラグインはたくさんあります。 JSON::PP (純粋な Perl 用 PP) は Perl コアの一部であるため、常に使用できる必要があります。 JSON :: XSはより効率的で、json_xsシェルスクリプトで便利に使用できる機能を提供します。

json_xs -e 'use List::Util "uniq"; $_ = [uniq @$_]' < array.json

すでに慣れている場合は、sなどの新しい言語をperl学ぶ必要がなく、jq知っている言語を再利用してXML、YAMLなどの他の形式で作業できることを意味します。

おすすめ記事