2017-12-12 9 views
0

は、私は下に与えられたいくつかのJSONデータがあるとします。jqを使用してキー値のペアに基づいてjsonデータをフィルタリングする方法は?

{"name":"alon","department":"abc","id":"ss12sd"} 
{"name":"kate","department":"xyz","id":"ajsj3" } 
{"name":"sam","department":"abc","id":"xx1d2"} 

私は特定の部門に基づいてデータをフィルタリングし、異なるJSONファイルに保存します。上のデータから、部門が 'abc'であるすべてのデータをフィルタリングし、新しいjsonファイルに保存するとします。私はjqを使ってこれをどのように行うことができますか?私はhereからマニュアルをチェックしていますが、あまり理解していませんでした。

答えて

1
jq 'map(select(.department == "abc")) ' yourfile.json 
+0

入力jsonファイルと出力ファイル名を指定する必要がある場所をjqに教えてください。 – neha

0

柔軟なテンプレートは以下のようになるかもしれません:あなたは、引数の段階での基準ではなく、表現を変更することができます

jq --arg key department --arg value abc \ 
'.[] | select(.[$key] == $value)' input_file.json > output_file.json

この方法です。あなたがそうのように呼び出します


myscript.sh

#!/usr/bin/env bash 
key="$1" 
value="$2" 
file="$3" 
outfile="$4" 
jq --arg key "$1" --arg value "$2" \ 
'.[] | select(.[$key] == $value)' "$3" > "$4" 

./myscript.sh department abc input.json output.json 

次のようになりますシェルスクリプトにその実装

編集:."\($key)".[$key]に変更しました - thanks @peak

+0

そうです。実際に私の入力ファイルは以下のようになります: {"name": "alon"、 "department": "abc"、 "id": "ss12sd"} {"name": "kate"、 "department": " "id": "ajsj3"} {"name": "sam"、 "department": "abc"、 "id": "xx1d2"} 次に、上記のクエリを実行しようとしている場合、エラー jq:エラー(test.json:1):文字列 "location"で文字列をインデックスできません – neha

+0

文字列 "department"で文字列をインデックスできません – neha

+0

@peak - ありがとうございました。 – hmedia1

関連する問題