Awk
搜尋、分離和清除 txt 值
真正讓我感到震驚的是引號。
我有一個
file.txt
像這樣的行:{"a":"town, state, country","e":["john@company.com"],"n":"john smith"} {"a":"town, state, country","e":["zac@company.com","zacsurname@gmail.com"],"n":"zac surname"} {"a":"town, state, country","n":"jane doe"}
我只尋找名字和電子郵件,並丟棄沒有兩者的數據。所以
output.txt
上面的 3 行應該是:john john@company.com zac zac@company.com zac zacsurname@gmail.com
我試過 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
它都不起作用。謝謝您的幫助。
由於您的文件是 JSON 文件,因此使用 JSON 解析器(例如
jq
)來解析它是最有意義的:jq -r ' select(has("n") and has("e")) | (.n|split(" ")[0]) as $name | .e[] | [ $name, . ] | @tsv' file.txt
這會從您的對象集中選擇同時具有 a
n
和e
key 的所有對象,並丟棄其餘對象。對於每個選定的對象,
n
鍵的值按空格分割,第一個生成的單詞分配給內部變數$name
。然後我們遍歷數組的元素並使用值和元素(電子郵件地址)
e
創建數組。$name
這些數組中的每一個都提供給@tsv
操作員,操作員將數據輸出為兩個欄位的製表符分隔列表。結果將是
john john@company.com zac zac@company.com zac zacsurname@gmail.com
感興趣的讀者請注意:我將其擴展為僅提取與文件中允許的名稱列表匹配的第一個名稱的條目。請參閱我對Grep 文件中一行的第一個單詞的回答