awk可以处理在引用字段中包含逗号的CSV文件吗?

mag*_*hen 24 csv awk field quoting text-parsing

我使用awk来计算csv文件中一列的总和.数据格式如下:

id, name, value
1, foo, 17
2, bar, 76
3, "I am the, question", 99
Run Code Online (Sandbox Code Playgroud)

我使用这个awk脚本来计算总和:

awk -F, '{sum+=$3} END {print sum}'
Run Code Online (Sandbox Code Playgroud)

name字段中的某些值包含逗号,这会破坏我的awk脚本.我的问题是:能解决这个问题吗?如果是的话,我该怎么做?

谢谢.

Ste*_*eve 20

使用GNU awkFPAT的一种方式

awk 'BEGIN { FPAT = "([^, ]+)|(\"[^\"]+\")" } { sum+=$3 } END { print sum }' file.txt
Run Code Online (Sandbox Code Playgroud)

结果:

192
Run Code Online (Sandbox Code Playgroud)

  • 这很好,除非你需要能够匹配完全空的字段:`FPAT ="([^,]*)|(\"[^ \"] + \")"}`.否则它不匹配行上的字段`22 ,,,"some string"` (2认同)

Fra*_* gu 6

我在用

`FPAT="([^,]+)|(\"[^\"]+\")" `
Run Code Online (Sandbox Code Playgroud)

用 gawk 定义字段。我发现当该字段为空时,它无法识别正确的字段数。因为“+”要求字段中至少有 1 个字符。我把它改成:

`FPAT="([^,]*)|(\"[^\"]*\")"`
Run Code Online (Sandbox Code Playgroud)

并替换"+""*". 它工作正常。

我也发现GNU Awk User Guide也有这个问题。 https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html


Dae*_*yth 5

您最好使用 Text::CSV 在 perl 中执行此操作,因为这是一个快速而强大的解决方案。


Vij*_*jay -6

你在 awk 中编写一个函数,如下所示:

$ awk 'func isnum(x){return(x==x+0)}BEGIN{print isnum("hello"),isnum("-42")}'
0 1
Run Code Online (Sandbox Code Playgroud)

您可以在脚本中合并此函数并检查第三个字段是否为数字。如果不是数字,则转到第四个字段,如果第四个字段不是数字,则转到第五个...直到达到数字值。也许一个循环在这里会有所帮助,并将其添加到总和中。

  • 这真的很笨重,如果字段不是数字,它就会失败。@Steve 的答案要好得多。 (3认同)