我必须使用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
答案 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