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

これにより、オブジェクトセットでanとキーの両方を含むすべてのオブジェクトが選択され、残りは削除されます。e

選択した各オブジェクトに対して、キー値がnスペースに分割され、最初に生成された単語が内部変数に割り当てられます$name

次に配列の要素を繰り返し、e値と要素(電子メールアドレス)を含む配列を作成します$name。各配列は、@tsv2つのフィールドのタブ区切りリストにデータを出力する演算子に提供されます。

結果は次のとおりです。

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

興味のある読者のための注意:この機能は、ファイルに許可されている名前のリストと一致するものだけを抽出するように拡張されました。私の答えを見るファイル行の最初の単語をGrepします。

おすすめ記事