【问题标题】:how to use "," as field delimiter [duplicate]如何使用“,”作为字段分隔符[重复]
【发布时间】:2021-12-22 22:50:25
【问题描述】:

我有一个这样的文件:

"1","ab,c","def"

所以只使用逗号作为字段分隔符会得到错误的结果,所以我想使用“,”作为字段分隔符,我试过这样:

awk -F "," '{print $0}' file

或者像这样:

awk -F "","" '{print $0}' file

或者像这样:

awk -F '","' '{print $0}' file

但结果不正确,不知道如何将“”作为字段分隔符本身的一部分,

【问题讨论】:

标签: awk field delimiter


【解决方案1】:

如果你能处理 GNU awk,你可以使用 FPAT:

$ echo '"1","ab,c","def"' |        # echo outputs with double quotes
gawk '                             # use GNU awk
BEGIN {
    FPAT="([^,]*)|(\"[^\"]+\")"    # because FPAT
}
{
    for(i=1;i<=NF;i++)             # loop all fields
        gsub(/^"|"$/,"",$i)        # remove leading and trailing double quotes
    print $2                       # output for example the second field
}'

输出:

ab,c

FPAT 无法处理引号内的RS

【讨论】:

    【解决方案2】:

    无论如何,你正在尝试的似乎是错误的。换成这个怎么样?

    awk '/^".*"$/{ sub(/^\"/, ""); sub(/\"$/, ""); gsub(/\",\", ",") }1'
    

    处理带有引号的 CSV 文件的正确解决方案是使用具有实际 CSV 解析器的语言。我想到了 Python,它的标准库中包含一个 csv module

    【讨论】:

      【解决方案3】:

      在 GNU 中 AWK

      {print $0}
      

      打印整行,如果没有更改原始行是printed,无论您设置什么字段分隔符,如果只有操作是print $0,您将得到原始行。使用$1=$1 触发字符串重建。

      如果您必须以任何价格通过FS 进行操作,那么您可以按照以下方式进行操作:让file.txt 内容成为

      "1","ab,c","def"
      

      然后

      BEGIN{FS="\x22,?\x22?"}{$1=$1;print $0}
      

      输出

       1 ab,c def
      

      注意前导空格(ab,c 是 3 美元)。解释:我通知 GNU AWK 字段分隔符是文字 "\x22" 在 ASCII 中是 22(十六进制))后跟零或一(?, 后跟零或一(?) 文字 " (\x22)。 $1=$1 触发线如前所述重建。免责声明:此解决方案假定您从未在字符串中转义 "

      (在 gawk 4.2.1 中测试)

      【讨论】:

        猜你喜欢
        • 2011-02-06
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-02-19
        • 2014-11-05
        • 2019-12-22
        • 1970-01-01
        相关资源
        最近更新 更多