首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何包含第二个awk以避免awk | awk

如何包含第二个awk以避免awk | awk
EN

Stack Overflow用户
提问于 2020-12-06 09:11:42
回答 6查看 86关注 0票数 0

这是输入字符串:

代码语言:javascript
复制
status=N&Cau=1&Litrs=0&Freq=0&Min=0

这是用于提取值并解析为csv:的awk (它可以工作,但可以做得更好。)

代码语言:javascript
复制
awk 'BEGIN {FS="&"}{for (i=1;i<=NF;i++) print $i}' | awk 'BEGIN {FS="="} {printf("%s;"),$2}'

结果是:

代码语言:javascript
复制
N;1;0;0;0;

问题是:有没有办法在一个awk中做到这一点?(不是awk | awk)

CSV中的第一行将是:

代码语言:javascript
复制
awk 'BEGIN {FS="&"}{for (i=1;i<=NF;i++) print $i}' | awk 'BEGIN {FS="="} {printf("%s;"),$1}'
status;Cau;Litrs;Freq;Min;
EN

回答 6

Stack Overflow用户

发布于 2020-12-06 22:52:41

这里设置了OFSFS,然后使用$1=$1 trick重新构建$0,并通过一些最后的消息将第一个;移动到末尾。

代码语言:javascript
复制
awk 'BEGIN { OFS=";"; FS="(^|&)[^&]*=" } { $1=$1; print substr($0,2)";" }'
N;1;0;0;0;
票数 2
EN

Stack Overflow用户

发布于 2020-12-06 09:28:34

I mean...you可以这样做:

代码语言:javascript
复制
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]
  }
}
'

但我不知道这是不是有很大的进步!

票数 0
EN

Stack Overflow用户

发布于 2020-12-06 10:21:17

如果您的输入只有一行--看起来可能是因为您正在解析一个URL --那么您可以使用下面的代码:

代码语言:javascript
复制
awk 'BEGIN {FS="="; RS="&"} {sub(/\n$/,"",$2); printf "%s;", $2} END {printf "\n";}'

这样就认识到,输入只是记录和字段,分隔方式不同于换行符和空格--因此,通过将字段分隔符更改为=,将记录分隔符更改为&,将每个xx=N段作为单独的行进行处理,其中$2等于N。因此,我们只需为每条记录打印$2,后跟分号。但是,如果在输入行的末尾有一个换行符,这可能会弄乱最后一条记录,这就是为什么需要sub(/\n$/,"",$2);的原因,请删除任何换行符。END子句提供一个结束换行符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65163709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档