如何使用 awk 检测嵌入的字段名称和重新排序字段?

M.E*_*.E. 0 regex awk freebsd

我有以下数据:

"b":1.14105,"a":1.14106,"x":48,"t":1594771200000
"a":1.141,"b":1.14099,"x":48,"t":1594771206000
...
Run Code Online (Sandbox Code Playgroud)

我试图以给定的顺序显示数据,并且只显示三个字段。由于不保证字段顺序,我需要为每行的每个逗号分隔列读取“标签”。

我尝试使用awk以下方法解决此任务:

awk -F',' '
                {
                        for(i=1; i<=$NF; i++) {
                                if(index($i,"\"a\":")!=0) a=$i;
                                if(index($i,"\"b\":")!=0) b=$i;
                                if(index($i,"\"t\":")!=0) t=$i;
                        }
                        printf("%s,%s,%s\n",a,b,t);
                }
        '
Run Code Online (Sandbox Code Playgroud)

但我得到:

,,
,,
...
Run Code Online (Sandbox Code Playgroud)

在上面的数据样本中,我希望:

"a":1.14106,"b":1.14105,"t":1594771200000
"a":1.141,"b":1.14099,"t":1594771206000
...
Run Code Online (Sandbox Code Playgroud)

注意:我使用的是 FreeBSD 附带的 awk

Ed *_*ton 5

$ cat tst.awk
BEGIN {
    FS = "[,:]"
    OFS = ","
}
{
    for (i=1; i<NF; i+=2) {
        f[$i] = $(i+1)
    }
    print p("a"), p("b"), p("t")
}

function p(tag, t) {
    t = "\"" tag "\""
    return t ":" f[t]
}
Run Code Online (Sandbox Code Playgroud)

.

$ awk -f tst.awk file
"a":1.14106,"b":1.14105,"t":1594771200000
"a":1.141,"b":1.14099,"t":1594771206000
Run Code Online (Sandbox Code Playgroud)