나를 정말 혼란스럽게 만드는 것은 인용문이다.
나는 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합니다.