私を本当に混乱させるのは引用です。
私は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
これにより、オブジェクトセットでan
とキーの両方を含むすべてのオブジェクトが選択され、残りは削除されます。e
選択した各オブジェクトに対して、キー値がn
スペースに分割され、最初に生成された単語が内部変数に割り当てられます$name
。
次に配列の要素を繰り返し、e
値と要素(電子メールアドレス)を含む配列を作成します$name
。各配列は、@tsv
2つのフィールドのタブ区切りリストにデータを出力する演算子に提供されます。
結果は次のとおりです。
john [email protected]
zac [email protected]
zac [email protected]
興味のある読者のための注意:この機能は、ファイルに許可されている名前のリストと一致するものだけを抽出するように拡張されました。私の答えを見るファイル行の最初の単語をGrepします。