搜索、分离和清除 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 文档,因此使用 JSON 解析器(例如 )jq来解析它是最有意义的:

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

这将从对象集中选择同时具有 anekey 的所有对象,并丢弃其余对象。

对于每个选定的对象,键的值n按空格分割,并将第一个生成的单词分配给内部变量$name

然后,我们迭代数组的元素e,并创建包含值和元素(电子邮件地址)的数组$name。每个数组都提供给运算@tsv符,该运算符将数据输出为两个字段的制表符分隔列表。

结果将是

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

感兴趣的读者请注意:我对此进行了扩展,以仅提取第一个名称与文件中允许的名称列表匹配的条目。请参阅我的回答Grep 文件中一行的第一个单词

相关内容