txt 값 검색, 분리 및 지우기

txt 값 검색, 분리 및 지우기

나를 정말 혼란스럽게 만드는 것은 인용문이다.

나는 file.txt다음 줄을 가지고 있습니다 :

{"a":"town, state, country","e":["[email protected]"],"n":"john smith"}
{"a":"town, state, country","e":["[email protected]","[email protected]"],"n":"zac surname"}
{"a":"town, state, country","n":"jane doe"}

이름과 이메일만 찾고 둘 다 포함되지 않은 데이터는 삭제합니다. 따라서 output.txt위의 3줄은 다음과 같아야 합니다.

john [email protected]
zac [email protected]
zac [email protected]

예를 들어 awk, nawk, pcregrep, sed, perl을 시도했습니다.

awk -F ":" '$1 ~ /^e/ && $1 ~ /^n/ { print $1,$1 }' file.txt > output.txt
awk -F "\"e\":\"" '{ print $1}' file.txt > output.txt
nawk '/\"e\":[\"/, /\"]/' file.txt > output.txt
pcregrep -o '(?<=[\").*?(?=\"])' <<< file.txt > output.txt

이들 중 어느 것도 작동하지 않습니다. 당신의 도움을 주셔서 감사합니다.

답변1

파일은 JSON 문서이므로 jq다음과 같은 JSON 구문 분석기를 사용하여 구문 분석하는 것이 가장 적합합니다.

jq -r '
    select(has("n") and has("e")) |
    (.n|split(" ")[0]) as $name |
    .e[] | [ $name, . ] | @tsv' file.txt

이렇게 하면 객체 세트에서 a n와 키가 모두 포함된 모든 객체가 선택되고 나머지는 삭제됩니다.e

선택한 각 개체에 대해 키 값이 n공백으로 분할되고 처음 생성된 단어가 내부 변수에 할당됩니다 $name.

그런 다음 배열의 요소를 반복 e하고 값과 요소(이메일 주소)를 포함하는 배열을 만듭니다 $name. 각 배열은 @tsv두 필드의 탭으로 구분된 목록으로 데이터를 출력하는 연산자에 제공됩니다 .

결과는 다음과 같습니다

john    [email protected]
zac     [email protected]
zac     [email protected]

관심 있는 독자를 위한 참고 사항: 이름이 파일에 허용된 이름 목록과 일치하는 항목만 추출하도록 이 기능을 확장했습니다. 내 답변 보기파일 줄의 첫 번째 단어를 Grep합니다.

관련 정보