使用awk解析包含逗号的csv文件

时间:2010-12-04 01:36:11

标签: csv awk

我必须使用awk在csv文件中打印出4个不同的列。问题是字符串是$ x,xxx.xx格式。当我运行常规awk命令时。

awk -F, {print $1} testfile.csv 

我的输出`看起来像

307.00
$132.34
30.23

我做错了什么。

"$141,818.88","$52,831,578.53","$52,788,069.53"  这大致是输入。我必须解析的文件是90,000行和大约40列 这就是输入的布局方式,或者至少是我必须处理的部分。对不起,如果我让你认为这不是我所说的。

如果输入为“$ 307.00”,“$ 132.34”,“$ 30.23” 我希望输出在

$307.00
$132.34
$30.23

4 个答案:

答案 0 :(得分:16)

奇怪的是,我不得不在前一段时间解决这个问题,并且我保留了代码来完成它。你几乎拥有它,但你需要对你的字段分隔符有点棘手。

awk -F'","|^"|"$' '{print $2}' testfile.csv 

输入

# cat testfile.csv
"$141,818.88","$52,831,578.53","$52,788,069.53"
"$2,558.20","$482,619.11","$9,687,142.69"
"$786.48","$8,568,159.41","$159,180,818.00"

输出

# awk -F'","|^"|"$' '{print $2}' testfile.csv
$141,818.88
$2,558.20
$786.48

您会注意到“第一个”字段实际上是$2,因为字段分隔符^"。如果你问我,可以支付短的单线价格。

答案 1 :(得分:6)

我认为你所说的是你想要将输入分成CSV字段,而不是被双引号内的逗号绊倒。如果是的话......

首先,使用","作为字段分隔符,如下所示:

awk -F'","' '{print $1}'

然而,你仍然会在$ 1的开头(以及最后一个字段的末尾)结束一个混乱的双引号。通过使用gsub删除引号来处理它,如下所示:

awk -F'","' '{x=$1; gsub("\"","",x); print x}'

结果:

echo '"abc,def","ghi,xyz"' | awk -F'","' '{x=$1; gsub("\"","",x); print x}'

abc,def

答案 2 :(得分:2)

为了让awk处理包含字段分隔符的引用字段,您可以使用我编写的名为csvquote的小脚本。它会暂时用非打印字符替换有问题的逗号,然后在管道末尾恢复它们。像这样:

csvquote testfile.csv | awk -F, {print $1} | csvquote -u

这也适用于任何其他UNIX文本处理程序,如cut:

csvquote testfile.csv | cut -d, -f1 | csvquote -u

您可以在此处获取csvquote代码:https://github.com/dbro/csvquote

答案 3 :(得分:1)

数据文件:

$ cat data.txt
"$307.00","$132.34","$30.23"

AWK脚本:

$ cat csv.awk
BEGIN { RS = "," }
{ gsub("\"", "", $1);
  print $1 }

执行:

$ awk -f csv.awk data.txt
$307.00
$132.34
$30.23