【问题标题】:Enclose last two fields of a CSV file in quotes用引号将 CSV 文件的最后两个字段括起来
【发布时间】:2018-03-24 11:46:11
【问题描述】:

我有以下 csv:

column1, column2, column3
1, 03-12-2017, some text, with commas

我正在寻找将配额添加到最后一列的简单方法(linux 工具):

column1, column2, column3
1, 03-12-2017, "some text, with commas"

你有什么想法吗?

【问题讨论】:

标签: linux csv awk sed


【解决方案1】:

你可以使用sed:

sed '1!{s/\([^,]*,[^,]*, \)/\1"/;s/$/"/}' 
  • 1! 表示该块不应应用于第一行
  • [^,]* 表示尽可能多的非逗号字符
  • 前两列(即非逗号字符、逗号、空格、非逗号字符、逗号、空格)在\1 中被记住并由它们自己替换,然后是"
  • 行尾$ 替换为"

【讨论】:

    【解决方案2】:

    awk 是处理分隔文件的好工具:

    awk -F",[ ]*" '
        NR==1 { print; next }
              { for(i=1; i<NF-1; i++) { printf("%s, ", $i) } printf("\"");
                printf("%s, ", $(NF-1));
                printf("%s\"\n", $NF) }' file
    
    • -F",[ ]*" - 使用 "逗号后跟零个或多个空格作为字段分隔符;如果您确定所有分隔符在逗号后都有一个空格,则可以使用 -F", "

    【讨论】:

      【解决方案3】:

      如果可以超过3个字段,
      你可以试试这个awk

      awk -F, '
        NR!=1{
        $NF=$NF"\""
        a=b=$(NF-1)
        sub(/[^[:blank:]].*/,"",a)
        sub(/^[[:blank:]]*/,"",b)
        $(NF-1)=a "\"" b
        }1' OFS=, infile
      

      或者这个sed

      sed -E '
        1b
        s/([[:blank:]])([^,]*,[^,]*$)/\1"\2"/
        ' infile
      

      【讨论】:

        【解决方案4】:
        awk 'BEGIN{FS=OFS=", "}NR>1{$3="\""$3;$4=$4"\""}1' file
        

        输出将双引号添加到第二行最后 2 个字段

        column1, column2, column3
        1, 03-12-2017, "some text, with commas"
        

        【讨论】:

          猜你喜欢
          • 2014-02-20
          • 2022-01-26
          • 2011-02-14
          • 1970-01-01
          • 1970-01-01
          • 2021-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多