[英]How to convert text file to a JSON file using a shell script
I have a file which looks like this (myfile.txt)我有一个看起来像这样的文件(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
I have to write this text content to a JSON file (myfile.json).我必须将此文本内容写入 JSON 文件 (myfile.json)。 this is the expected output
这是预期的 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"}
]
this is what I tried这就是我尝试过的
I created a file called "textconvert.sh".我创建了一个名为“textconvert.sh”的文件。 then wrote a shell script like this.
然后像这样写了一个 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
but I am not allowed to hard coding like this.但我不允许像这样硬编码。 what I am thinking now is,
我现在想的是,
write a loop to scan "myfile.txt" then assign column values to variables.编写一个循环来扫描“myfile.txt”,然后将列值分配给变量。 then write a json file.
然后写一个 json 文件。
Can someone help me to figure out this?有人可以帮我解决这个问题吗? Thanks in advance
提前致谢
Using sed使用 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"}
]
Using any awk:使用任何 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"}
]
Regarding What I am thinking now is, write a loop to scan "myfile.txt"...
from your question - no, don't do that.关于
What I am thinking now is, write a loop to scan "myfile.txt"...
从你的问题 - 不,不要那样做。 See why-is-using-a-shell-loop-to-process-text-considered-bad-practice .请参阅为什么使用-shell-loop-to-process-text-considered-bad-practice 。
I would harness GNU AWK
for this task following way, let file.txt
content be我将按照以下方式利用 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
then然后
awk 'BEGIN{print "["}NR>1{print ","}{printf "{\"ApplicationName\":\"%s\",\"BuildBreakReason\":\"%s\",\"DefectAuthor\":\"%s\"}",$2,$4,$3}END{print "\n]"}' file.txt
gives output给出 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"}
]
Explanation: You need ,
after every but last characters, but detecting last line in GNU AWK
is not easy, so I print
,
before every but 1st record.说明:您需要
,
在除最后一个字符之后,但在 GNU AWK
中检测最后一行并不容易,所以我print
,
在除第一条记录之前。 I use printf
to rework your whitespace-sheared records into JSON, 1st argument is string with places to fill denoted by %s
, observe that "
needs to be escaped to mean literal "
.我使用
printf
将您的空白剪切记录重新加工为 JSON,第一个参数是字符串,其中填充的位置由%s
表示,请注意"
需要转义以表示文字"
。 BEGIN
and END
are used to encase records into [
and ]
. BEGIN
和END
用于将记录封装到[
和]
中。 Disclaimer : this code does not espace characters of special meaning to JSON, for example "
.免责声明:此代码不会对 JSON 具有特殊含义的字符进行空格分隔,例如
"
.
(tested in gawk 4.2.1) (在 gawk 4.2.1 中测试)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.