Linux

從 shell 腳本中以冒號分隔的數據生成 JSON

  • March 24, 2017

我有這樣的文件

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可以避免所有需要的\"-sequences echo。請注意行尾的反斜杠以將其拆分。

順便說一句:您生成的格式稱為 JSON,並且可能有工具可以幫助生成它(例如,jq)。此外,如果您的欄位可以包含雙引號,則它可能需要自己的轉義。

perl

perl -MJSON -F: -ple '@A = qw/randomId id userId dns status/; $_ = encode_json({map { shift @A => { "s" => $_ } } @F } )' input.csv

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