検索テキストとjsonlファイルの間の交差点を見つける

検索テキストとjsonlファイルの間の交差点を見つける

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

  1. -F固定文字列を使用してregex
  2. -o一致する文字列のみを表示するために使用されます。
  3. -f指定に使用模様文書。この場合、次の文字列がgrep検索されます。Alice、、、、goestoschool

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(、、、、goestoを検索することです。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 -uxargs()のパイピングを| 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 -12andの行のみを印刷します(ここで、file1とfile2はプロセス置換を表します)。file1file2<(code...)

関連情報