How do I detect embbeded field names and reorder fields using awk?

落花浮王杯 提交于 2020-08-10 19:18:59

问题


I have the following data:

"b":1.14105,"a":1.14106,"x":48,"t":1594771200000
"a":1.141,"b":1.14099,"x":48,"t":1594771206000
...

I am trying to display data in a given order and only for three fields. As the fields order is not guaranteed, I need to read the "tag" for each comma separated column for each line.

I have tried to solve this task using 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);
                }
        '

But I get:

,,
,,
...

In the above data sample, I would expect:

"a":1.14106,"b":1.14105,"t":1594771200000
"a":1.141,"b":1.14099,"t":1594771206000
...

Note: I am using the awk shipped with FreeBSD


回答1:


With awk and an array:

awk -F '[:,]' '{for(i=1; i<=NF; i=i+2){a[$i]=$(i+1)}; print "\"a\":" a["\"a\""] ",\"b\":" a["\"b\""] ",\"t\":" a["\"t\""]}' file

or

awk -F '[":,]' '{for(i=2; i<=NF; i=i+4){a[$i]=$(i+2)}; print "\"a\":" a["a"] ",\"b\":" a["b"] ",\"t\":" a["t"]}' file

Output:

"a":1.14106,"b":1.14105,"t":1594771200000
"a":1.141,"b":1.14099,"t":1594771206000



回答2:


$ 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]
}

.

$ awk -f tst.awk file
"a":1.14106,"b":1.14105,"t":1594771200000
"a":1.141,"b":1.14099,"t":1594771206000



回答3:


similar awk where you can specify the fields and order.

$ awk -F[:,] -v fields='"a","b","t"' 'BEGIN{n=split(fields,f)} 
            {for(i=1;i<NF;i+=2) map[$i]=$(i+1); 
             for(i=1;i<=n;i++) printf "%s", f[i]":"map[f[i]] (i==n?ORS:",")}' file

"a":1.14106,"b":1.14105,"t":1594771200000
"a":1.141,"b":1.14099,"t":1594771206000


来源:https://stackoverflow.com/questions/62925668/how-do-i-detect-embbeded-field-names-and-reorder-fields-using-awk

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!