真正让我困惑的是引号。
我有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
这将从对象集中选择同时具有 an
和e
key 的所有对象,并丢弃其余对象。
对于每个选定的对象,键的值n
按空格分割,并将第一个生成的单词分配给内部变量$name
。
然后,我们迭代数组的元素e
,并创建包含值和元素(电子邮件地址)的数组$name
。每个数组都提供给运算@tsv
符,该运算符将数据输出为两个字段的制表符分隔列表。
结果将是
john [email protected]
zac [email protected]
zac [email protected]
感兴趣的读者请注意:我对此进行了扩展,以仅提取第一个名称与文件中允许的名称列表匹配的条目。请参阅我的回答Grep 文件中一行的第一个单词