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

使用awk解析字段中包含逗号的csv文件,csv,awk,Csv,Awk,我必须使用awk在csv文件中打印出4个不同的列。问题是字符串的格式是$x,xxx.xx。当我运行常规awk命令时 awk -F, {print $1} testfile.csv 我的输出结果看起来像 307.00 $132.34 30.23 我做错了什么 “$141818.88”、“$52831578.53”、“$52788069.53” 这大致就是输入。我必须解析的文件是90000行和大约40列 这就是输入的布局,或者至少是我必须处理的部分。对不起,如果我让你觉得这不是我说的 如果输入

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

awk -F, {print $1} testfile.csv 
我的输出结果看起来像

307.00
$132.34
30.23
我做错了什么

“$141818.88”、“$52831578.53”、“$52788069.53”
这大致就是输入。我必须解析的文件是90000行和大约40列 这就是输入的布局,或者至少是我必须处理的部分。对不起,如果我让你觉得这不是我说的

如果输入为“$307.00”、“$132.34”、“$30.23” 我希望输出是在一个

$307.00
$132.34
$30.23

我想你说的是,你想把输入分割成CSV字段,同时不要被双引号中的逗号绊倒。如果是的话

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

awk -F'","' '{print $1}'
awk -F'","' '{x=$1; gsub("\"","",x); print x}'
但是,您仍然会在$1的开头(以及最后一个字段的末尾)得到一个零散的双引号。通过使用gsub剥离引号来处理此问题,如下所示:

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

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

abc,def
数据文件:

$ 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

奇怪的是,前一段时间我不得不解决这个问题,我一直保留着代码。你差一点就成功了,但是你需要对你的字段分隔符有点技巧

输入 输出
您会注意到,由于字段分隔符
^“
。如果你问我的话,一个简短的单行程序的价格很低。

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

csvquote testfile.csv | awk -F, {print $1} | csvquote -u
这也适用于任何其他UNIX文本处理程序,如cut:

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

您可以在这里获得csvquote代码:

提供一个示例输入,我将看看您可以对输出做些什么。好的,提供与实际输入不相似的示例输入是毫无价值的。给。我代表性样品。输入。可能重复[使用awk解析csv并忽略字段内的逗号]()。这个问题的答案中有一个链接指向处理CSV文件的AWK脚本。不过,一般来说,最好使用专门为CSV文件设计的工具,或者使用Python或Perl模块。但是我需要使用awk来解析它。请发布一个输入示例和所需的成对输出。谢谢你,这非常有效。这两天来我一直在忙这件事太棒了!请确保单击绿色复选标记,表示这为您解决了问题。您可以在不需要gsub()和其他变量的情况下执行此操作。关键是在
-F',“| ^”|“$”
中使用多个字段分隔符(参见我的答案)。OP的问题不是很清楚,但当字段本身带有逗号时,他的问题就会出现。请看我的答案,了解如何解决这个问题。我接受了他的输入并生成了他想要的输出。如果他想要别的东西,他应该要的非常圆滑!在这个方法的基础上,这里有一种处理讨厌的空第一个字段的方法,因此字段号通常以
$1
开头:
awk-F',“|^”|“$”{sub(^\,“)}{print$1}”
当不是每个字段都使用引号时,这个方法会起作用吗?例如对于
ANAD,2.69183.38446.31,2.90,41.46,“技术”,“半导体集成电路”“,,2.34,40.10%,-51.88%,33.17%,-16.46%,“Anadigics,Inc.”,3.18%,“USA”,
,所以我只想抓住
“Anadigics,Inc.”
,在
$15
位置,当
$1==“ANAD”
@Marcos no,很抱歉它不会。但是,您只需要使用逗号作为字段分隔符,因此当I
stock=“ANAD”;awk-F','$1==“$stock”{print$15}时,Anadigics
仅返回'AllStocks.csv但是thanks@Marcos这是因为这不是向
awk
传递变量的方式。
$stock
永远不会扩展,因为整个awk命令都在单引号内。您需要执行
stock=“ANAD”;awk-F',''$1==stock{print$15}'stock=“$stock=”“AllStocks.csv
很高兴我找到了这个伟大的实用工具!我终于找到了一种可靠的方法,可以在没有Select into outfile权限的服务器上解析mysqldump输出。
csvquote testfile.csv | cut -d, -f1 | csvquote -u