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
명령을 사용하여 교차점을 얻을 수도 있습니다 . 하지만 주문해야 해문서(Line)은 다음을 활용할 수 있습니다.
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...)