用awk解析字段中包含commans的csv文件

Dud*_*mus 12 csv awk

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

awk -F, {print $1} testfile.csv 
Run Code Online (Sandbox Code Playgroud)

我的输出结果看起来像

307.00
$132.34
30.23
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么.

"$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
Run Code Online (Sandbox Code Playgroud)

Sie*_*geX 16

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

awk -F'","|^"|"$' '{print $2}' testfile.csv 
Run Code Online (Sandbox Code Playgroud)

输入

# 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"
Run Code Online (Sandbox Code Playgroud)

产量

# awk -F'","|^"|"$' '{print $2}' testfile.csv
$141,818.88
$2,558.20
$786.48
Run Code Online (Sandbox Code Playgroud)

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

  • 非常光滑!在这种方法的基础上,这里有一种处理那个讨厌的空第一个字段的方法,所以字段编号像往常一样以"$ 1"开头:`awk -F'","| ^"|"$''{sub("^\"","")} {print $ 1}'` (2认同)
  • 当不是每个字段都使用引号时,这是否有效?例如.对于ANAD,2.69,183.38,446.31,2.90,41.46,"技术","半导体 - 集成电路",2.34,40.10%, - 51.88%,33.17%, - 16.46%,"Anadigics,Inc.",3.18 %,"美国","所以我试图只抓住`"Anadigics,Inc."`位置`$ 15`,当`$ 1 =="ANAD"时` (2认同)

Kam*_*mal 6

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

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

awk -F'","' '{print $1}'
Run Code Online (Sandbox Code Playgroud)

但是,你仍然会在1美元的开头(以及最后一个字段的末尾)结束一个迷路双引号.通过使用gsub删除引号来处理,如下所示:

awk -F'","' '{x=$1; gsub("\"","",x); print x}'
Run Code Online (Sandbox Code Playgroud)

结果:

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

abc,def
Run Code Online (Sandbox Code Playgroud)

  • 您可以在不需要gsub()和其他变量的情况下执行此操作.关键是使用多个字段分隔符`-F'","| ^"|"$'`(参见我的回答). (2认同)