我有一个如下所示的文件(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). 这是预期的yields

[
{"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"}
]

这就是我试过的

我创建了一个名为"extConvert.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文件.

有谁能帮我弄清楚这件事吗?

推荐答案

使用任何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"...-不,不要这样做.请参见why-is-using-a-shell-loop-to-process-text-considered-bad-practice.

Linux相关问答推荐

在Zenity进度窗口上单击取消后如何停止bash脚本

如何判断程序是在终端上运行还是在后台运行?

在 bash 中使用 tee 时如何返回错误代码

如何使用 sed 和 date 命令替换和格式化字符串中的日期?

如何在 Linux 上打印带有屏蔽值的环境名称?

如何更改文件的上次访问/修改/更改日期?

如何使用 sed debug调试正则表达式?

用于判断进程是否正在运行并对结果采取行动的 Linux 脚本

如何找出哪个进程正在消耗等待 CPU(即 I/O 阻塞)

为什么在编译 K&R2 第 1 章中最长的行示例时出现getline 的类型冲突错误?

如何将整个文件夹从 Amazon EC2 Linux 实例复制到本地 Linux 机器?

让 Tk 看起来像一个原生 Linux 应用程序

exec 系统调用(如 exec 和 execve)系列的功能有什么区别?

优雅地杀死在 Linux 上运行的 .NET Core 守护进程

Ant 找不到 javac,在 Ubuntu 上不会设置 JAVA_HOME

如何知道linux调度器时间片?

给定一个 linux 用户名和密码,我如何测试它是否是有效帐户?

如何从 Linux 内核模块的 init_module 代码创建设备 node ?

编译 OpenGL 程序 GL/glew.h 缺失

如何始终以 GB 为单位获取 df linux 命令输出