配列=>["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などの他の形式で作業できることを意味します。