Awk

搜尋、分離和清除 txt 值

  • July 25, 2021

真正讓我感到震驚的是引號。

我有一個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

這會從您的對象集中選擇同時具有 anekey 的所有對象,並丟棄其餘對象。

對於每個選定的對象,n鍵的值按空格分割,第一個生成的單詞分配給內部變數$name

然後我們遍歷數組的元素並使用值和元素(電子郵件地址)e創建數組。$name這些數組中的每一個都提供給@tsv操作員,操作員將數據輸出為兩個欄位的製表符分隔列表。

結果將是

john    john@company.com
zac     zac@company.com
zac     zacsurname@gmail.com

感興趣的讀者請注意:我將其擴展為僅提取與文件中允許的名稱列表匹配的第一個名稱的條目。請參閱我對Grep 文件中一行的第一個單詞的回答

引用自:https://unix.stackexchange.com/questions/659452