[英]How to convert text file to a JSON file using a shell script
我有一個看起來像這樣的文件(myfile.txt)
GYFUFGYO1 KMP-app james@qt.com CODE_SMELL
GYFUFGYO2 KMP-app james@qt.com CODE_SMELL
GYFUFGYG3 AFP-Login nathan@qt.com BUG
GYFUFGYG4 AFP-Login nathan@qt.com BUG
GYFUFGYO5 KMP-app james@qt.com CODE_SMELL
GYFUFGYO6 KMP-app james@qt.com CODE_SMELL
我必須將此文本內容寫入 JSON 文件 (myfile.json)。 這是預期的 output
[
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "nathan@qt.com"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "nathan@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"}
]
這就是我嘗試過的
我創建了一個名為“textconvert.sh”的文件。 然后像這樣寫了一個 shell 腳本。
echo"[" >> myfile.json
echo {"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"}, >> myfile.json
echo {"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"}, >> myfile.json
echo {"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "nathan@qt.com"}, >> myfile.json
echo {"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "nathan@qt.com"}, >> myfile.json
echo {"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"}, >> myfile.json
echo {"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"} >> myfile.json
echo"]" >> myfile.json
但我不允許像這樣硬編碼。 我現在想的是,
編寫一個循環來掃描“myfile.txt”,然后將列值分配給變量。 然后寫一個 json 文件。
有人可以幫我解決這個問題嗎? 提前致謝
使用 sed
$ sed -E 's/[^ ]* +([^ ]*) +([^ ]*) +(.*)/{"ApplicationName":"\1","BuildBreakReason":"\3","DefectAuthor": "\2"},/;$s/,$/\n]/;1i[' myfile.txt
[
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "nathan@qt.com"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "nathan@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"}
]
使用任何 awk:
$ cat tst.awk
BEGIN {
fmt = "%s{\"ApplicationName\":\"%s\",\"BuildBreakReason\":\"%s\",\"DefectAuthor\": \"%s\"}"
print "["
}
{ printf fmt, sep, $2, $4, $3; sep="," ORS }
END { print ORS "]" }
$ awk -f tst.awk myfile.txt
[
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "nathan@qt.com"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "nathan@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "james@qt.com"}
]
關於What I am thinking now is, write a loop to scan "myfile.txt"...
從你的問題 - 不,不要那樣做。 請參閱為什么使用-shell-loop-to-process-text-considered-bad-practice 。
我將按照以下方式利用 GNU AWK
完成此任務,讓file.txt
內容為
GYFUFGYO1 KMP-app james@qt.com CODE_SMELL
GYFUFGYO2 KMP-app james@qt.com CODE_SMELL
GYFUFGYG3 AFP-Login nathan@qt.com BUG
GYFUFGYG4 AFP-Login nathan@qt.com BUG
GYFUFGYO5 KMP-app james@qt.com CODE_SMELL
GYFUFGYO6 KMP-app james@qt.com CODE_SMELL
然后
awk 'BEGIN{print "["}NR>1{print ","}{printf "{\"ApplicationName\":\"%s\",\"BuildBreakReason\":\"%s\",\"DefectAuthor\":\"%s\"}",$2,$4,$3}END{print "\n]"}' file.txt
給出 output
[
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor":"james@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor":"james@qt.com"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor":"nathan@qt.com"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor":"nathan@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor":"james@qt.com"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor":"james@qt.com"}
]
說明:您需要,
在除最后一個字符之后,但在 GNU AWK
中檢測最后一行並不容易,所以我print
,
在除第一條記錄之前。 我使用printf
將您的空白剪切記錄重新加工為 JSON,第一個參數是字符串,其中填充的位置由%s
表示,請注意"
需要轉義以表示文字"
。 BEGIN
和END
用於將記錄封裝到[
和]
中。 免責聲明:此代碼不會對 JSON 具有特殊含義的字符進行空格分隔,例如"
.
(在 gawk 4.2.1 中測試)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.