首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索特殊字段AWK中的字符

搜索特殊字段AWK中的字符
EN

Stack Overflow用户
提问于 2020-10-29 18:25:27
回答 1查看 54关注 0票数 2

我需要解析awk脚本中的字段来搜索特殊字符,如果存在,则替换为",“或"/”

awk脚本将CSV转换为DAT。定义的字段分隔符是;但有时用户会发送包含字段分隔符的注释。为了解决这个问题,我们需要解析数字为$4的注释字段,如果该字段包含;,则将其替换为逗号

这是文件

代码语言:javascript
复制
"PAT";"TARO";"GEO";"COMMENT"
"FRT";"1256";"USA";"THIS IS A COMMENT ; AFTER COMMENT"

outcome expected

PAT TARO    GEO COMMENT
FRT 1256    USA THIS IS A COMMENT / AFTER COMMENT


BEGIN { 
  FS = ";" ;
  OFS = "   " ;

print "pat taro geo comment";   


}

NR==1{
next
}

{
pat= $1;
taro = $2;
geo = $3 ; 
comment = $4 ;
}

if $4 contains ";" then 
replace with "/"
end if;

{
    print "pat,taro,geo,comment";   

}

我该怎么做呢?

提前谢谢你

EN

回答 1

Stack Overflow用户

发布于 2020-10-29 21:11:09

如果字段中没有换行符,您可以使用例如GNU awk及其FPAT特性:

代码语言:javascript
复制
$ gawk '
BEGIN {
    FPAT="([^;]*)|(\"[^\"]+\")"
}
{
    print $4
}' file

输出:

代码语言:javascript
复制
"COMMENT"
"THIS IS A COMMENT ; AFTER COMMENT"

如果仍要替换注释中的;,请在print之前添加gsub(/;/,"/",$4)

编辑

代码语言:javascript
复制
$ gawk '
BEGIN {
    FPAT="([^;]*)|(\"[^\"]+\")"   # FPAT;separates;semicolons;"and quotes"
    print "pat taro geo comment"  # print header
}
{
    for(i=1;i<=NF;i++)            # loop all 4 fields
        gsub(/^"|"$/,"",$i)       # remove quotes

    gsub(/;/,"/",$4)              # change the ; in $4 to /

    pat= $1                       # no need for this mut since you wanted
    taro = $2
    geo = $3
    comment = $4

    print pat,taro,geo,comment    # output new vars but you could as well:
    # print $1,$2,$3,$4           # use this too or
    # print $0                    # since record was rebuilt on gsub
}' file

输出:

代码语言:javascript
复制
pat taro geo comment
PAT TARO GEO COMMENT
FRT 1256 USA THIS IS A COMMENT / AFTER COMMENT
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64589202

复制
相关文章

相似问题

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