【问题标题】:Search a character within a special field AWK在特殊字段 AWK 中搜索字符
【发布时间】:2020-10-29 10:25:27
【问题描述】:

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

awk 脚本将 CSV 转换为 DAT。定义的字段分隔符是;但有时用户会发送包含字段分隔符的评论。为了解决这个问题,我们需要解析 NUMBER $4 的 COMMENT 字段,以防该字段包含 ;用/或逗号替换

这是文件

"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";   

}

我该怎么做?

提前谢谢你

【问题讨论】:

  • 能否请您在问题中发布输入和预期输出示例,以便更好地理解问题。
  • 如果您的数据有 4 个字段并且注释字段是最后一个,则 for 从 4 循环到 NF 并通过将 $i 附加到 $4 来重建 $4 并与哪个分开您想要的新分隔符。
  • 这些临时格式只会让你不开心。坚持使用标准 CSV 或切换到 JSON 之类的东西。你会感谢自己的。

标签: unix awk


【解决方案1】:

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

$ gawk '
BEGIN {
    FPAT="([^;]*)|(\"[^\"]+\")"
}
{
    print $4
}' file

输出:

"COMMENT"
"THIS IS A COMMENT ; AFTER COMMENT"

如果你还想替换 ;在评论中,在print 之前添加gsub(/;/,"/",$4)

编辑

$ 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

输出:

pat taro geo comment
PAT TARO GEO COMMENT
FRT 1256 USA THIS IS A COMMENT / AFTER COMMENT

【讨论】:

  • 我已将行放在打印之前,但没有任何反应。您能告诉我必须在哪些打印语句之前放置该行吗?开始{ FS =“;” ; OFS = " " ;打印“拍芋头地理评论”; } NR==1{ 下一个 } { 拍= $1;芋头=2美元;地理 = $3 ;评论 = $4 ; } gsub(/;/,"/",$4); {打印“拍,芋头,地理,评论”; }
猜你喜欢
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多