Linux
從 shell 腳本中以冒號分隔的數據生成 JSON
我有這樣的文件
103710:v2HAbAFH029324:vamsi.vallabhaneni6666@gmail.com:localhost:Sent 103821:CCFE5609E3:vamsi@moxieitcom.moxiecampaigner.com:localhost:bounced 103922:DFF19609E2:no-reply@mavenstaffing.in:localhost:Deferred
我需要將其更改為
{"randomId":{"s":"103710"},"id":{"s":"v2HAbAFH029324"},"userId":{"s":"vamsi.vallabhaneni6666@gmail.com"},"dns":{"s":"localhost"},"status":{"s":"Sent"}} {"randomId":{"s":"103821"},"id":{"s":"CCFE5609E3"},"userId":{"s":"vamsi@moxieitcom.moxiecampaigner.com"},"dns":{"s":"localhost"},"status":{"s":"bounced"}} {"randomId":{"s":"103922"},"id":{"s":"DFF19609E2"},"userId":{"s":"no-reply@mavenstaffing.in"},"dns":{"s":"localhost"},"status":{"s":"Deferred"}}
我在想這樣的程式碼
while read line do sed -i 's/^/{"randomId":{"s":"/' test echo $line echo $line | grep -q ":" [ $? -eq 0 ] && echo "/"{"id":{"s":/" [ $? -eq 1 ] && echo "/",{"userId":{"s":/" [ $? -eq 2 ] && echo "/",{"host":{"s":/" [ $? -eq 3 ] && echo "/",{"status":{"s":/" echo "$line | " "; done < test
添加第一次出現的 :
{"id":{"s":
然後第二次出現{"userId":{"s":
那個 grep/echo 塊不會做任何有用的事情;美元?將被設置一次——它不會遍歷欄位。
值得慶幸的是,似乎有一種更簡單的方法可以做到這一點:只需將欄位拆分為變數。謝天謝地,
read
可以為您做到這一點:while IFS=':' read -r randomid id userid dns status; do printf '{"randomId":{"s":"%s"},"id":{"s":"%s"},"userId":{"s":"%s"},"dns":{"s":"%s"},"status":{"s":"%s"}}\n' \ "$randomid" "$id" "$userid" "$dns" "$status" done
使用
printf
而不是更熟悉的方法echo
可以避免所有需要的\"
-sequencesecho
。請注意行尾的反斜杠以將其拆分。順便說一句:您生成的格式稱為 JSON,並且可能有工具可以幫助生成它(例如,jq)。此外,如果您的欄位可以包含雙引號,則它可能需要自己的轉義。
與
perl
:perl -MJSON -F: -ple '@A = qw/randomId id userId dns status/; $_ = encode_json({map { shift @A => { "s" => $_ } } @F } )' input.csv