jsonl
検索テキストと特定のファイルとの交点を検索して検索したいと思います。例は次のとおりです。
検索テキスト:
Alice goes to school
Jsonlファイルの内容:
{"text": "Alice goes to market"}
予想出力:
Alice goes to
grepを使って実装しようとしましたが、期待した動作は出力されませんでした。
答え1
あなたが所有しているものを所有してくださいjson
:
example.json
{"text": "Alice goes to market"}
このgrep
コマンドを使用するとうまくいくようです。
grep -Fo -f <(echo "Alice goes to school" | xargs -n1) <(jq -r '.text' < example.json) | xargs
どこgrep
:
-F
固定文字列を使用してregex
。-o
一致する文字列のみを表示するために使用されます。-f
指定に使用模様文書。この場合、次の文字列がgrep
検索されます。Alice
、、、、goes
to
school
jq -r
出力をJSONテキストの代わりに生の文字列として表示します。したがって、"Alice goes to market"
以下を得る代わりに:Alice goes to market
<(echo "Alice goes to school" | xargs -n1)
それについてプロセスの交換ファイルを渡す代わりにこれを使用します。
このコマンドはecho "Alice goes to school" | xargs -n1
以下を表示します。
Alice
goes
to
school
私も使ったプロセスの交換ここで:<(jq -r '.text' < example.json)
jsonキーの内容を取得しますtext
。これでjq -r '.text' < example.json
表示される内容は次のとおりです。
"Alice goes to the market"
デフォルトでは、fullが行うことは、grep
文字列内のすべての単語Alice
(、、、、goes
)to
を検索することです。school
"Alice goes to the market"
最後に、出力をパイプしてxargs
次の出力を取得します。
Alice goes to
パイプ()を使用しないと、| xargs
次のように出力されます。仕切り:
Alice
goes
to
その他のケース
json
ファイルに次の内容が含まれている場合:
[
{"text": "Alice goes to the market"}
]
[
{"text": "Alice went to the market"}
]
上記のコードを使用すると失敗します。ここではtext
キーが最初の位置(インデックス0)にあるので、次のものを簡単に使用できます。
grep -Fo -f <(echo "Alice goes to school" | xargs -n1) <(jq -r '.[0].text' < example2.json) | sort -u | xargs
気づく私は以前sort -u
xargs()のパイピングを| xargs
使用したことがあります。grep
文字列が表示されるからです。重複上記のjsonによるものです。削除すると、sort -u
次のようになります。
Alice goes to Alice to
使用comm
comm
コマンドを使用して交差点を取得することもできます。しかし注文する必要があります文書(線)は以下を利用できます。
comm -12 <(echo "Alice goes to school" | xargs -n1 | sort) <(jq -r '.text' < example.json | xargs -n1 | sort) | xargs
comm -12
andの行のみを印刷します(ここで、file1とfile2はプロセス置換を表します)。file1
file2
<(code...)