用引号括起CSV文件的最后两个字段

时间:2018-03-24 11:46:11

标签: linux csv awk sed

我有以下csv:

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

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

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

你有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您可以使用sed

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果可以超过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

答案 3 :(得分:1)

awk 'BEGIN{FS=OFS=", "}NR>1{$3="\""$3;$4=$4"\""}1' file

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

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