这是输入字符串:
status=N&Cau=1&Litrs=0&Freq=0&Min=0这是用于提取值并解析为csv:的awk (它可以工作,但可以做得更好。)
awk 'BEGIN {FS="&"}{for (i=1;i<=NF;i++) print $i}' | awk 'BEGIN {FS="="} {printf("%s;"),$2}'结果是:
N;1;0;0;0;问题是:有没有办法在一个awk中做到这一点?(不是awk | awk)
CSV中的第一行将是:
awk 'BEGIN {FS="&"}{for (i=1;i<=NF;i++) print $i}' | awk 'BEGIN {FS="="} {printf("%s;"),$1}'
status;Cau;Litrs;Freq;Min;发布于 2020-12-06 22:52:41
这里设置了OFS和FS,然后使用$1=$1 trick重新构建$0,并通过一些最后的消息将第一个;移动到末尾。
awk 'BEGIN { OFS=";"; FS="(^|&)[^&]*=" } { $1=$1; print substr($0,2)";" }'
N;1;0;0;0;发布于 2020-12-06 09:28:34
I mean...you可以这样做:
awk -F'&' '
{
for (i=1; i<=NF; i++) {
split($i, x, "=")
values[i]=x[2]
}
for (i=1; i<=length(values); i++) {
printf "%s;", values[i]
}
}
'但我不知道这是不是有很大的进步!
发布于 2020-12-06 10:21:17
如果您的输入只有一行--看起来可能是因为您正在解析一个URL --那么您可以使用下面的代码:
awk 'BEGIN {FS="="; RS="&"} {sub(/\n$/,"",$2); printf "%s;", $2} END {printf "\n";}'这样就认识到,输入只是记录和字段,分隔方式不同于换行符和空格--因此,通过将字段分隔符更改为=,将记录分隔符更改为&,将每个xx=N段作为单独的行进行处理,其中$2等于N。因此,我们只需为每条记录打印$2,后跟分号。但是,如果在输入行的末尾有一个换行符,这可能会弄乱最后一条记录,这就是为什么需要sub(/\n$/,"",$2);的原因,请删除任何换行符。END子句提供一个结束换行符。
https://stackoverflow.com/questions/65163709
复制相似问题