0

我有一个 CSV 文件,如下所示:

  height,  comment, name
  152,  he was late, for example, on Tuesday, Fred
  162, , Sam

我无法解析此文件,因为它在注释字段中包含可变数量的未括起来的逗号(但没有其他字段)。我想使用awk(这对我来说很新)修复文件,以便第二个字段中的逗号变为分号:

  height,  comment, name
  152,  he was late; for example; on Tuesday, Fred
  162, , Sam

(将整个字段括在引号中不会解决我的问题,因为我的 CSV 解析器不理解引号。)

到目前为止,我正在考虑使用 NF 来计算未括起来的逗号的数量,然后使用 gsub 用令人不快的正则表达式替换它们,但我觉得我应该能够利用 awk 编写一个更具可读性的程序,我不确定 NF 的行为这边走。

4

2 回答 2

2

本质上只是一个蛮力解决方案,但相当容易理解。调用

$ awk -F "," -f test.awk test.dat

awk 文件。

$ cat test.awk
{
    printf "%s, ", $1

    if (NF > 3) {
        for (i = 2; i < NF; i++) {
            printf "%s;", $i
        }
        printf ", "
    }
    else {
        printf "%s, ", $2
    }

    printf "%s\n", $NF
}
于 2013-02-13T03:41:26.593 回答
2
$ cat file
  height,  comment, name
  152,  he was late, for example, on Tuesday, Fred
  162, , Sam

$ awk -v OFS=, '{
   height = comment = name = $0
   sub(/,.*$/,"",height)
   sub(/^.*,/,"",name)
   gsub(/^[^,]+,|,[^,]+$/,"",comment)
   gsub(/,/,";",comment)

   print height, comment, name
}' file
  height,  comment, name
  152,  he was late; for example; on Tuesday, Fred
  162, , Sam
于 2013-02-13T03:42:00.550 回答