【问题标题】:deleting a particular column in csv which is enclosed with quotes删除 csv 中用引号括起来的特定列
【发布时间】:2018-05-24 20:57:52
【问题描述】:

我有一个包含

的 csv 文件
a,b,c,d,e,f,"gg,hh,ii",j,k

我一直在尝试使用类似的东西

awk -F ',' '{print $7}'

我来了

"gg

但我需要结果为

gg,hh,ii

我可以用一个简单的单行 awk 或 sed 命令完成它而无需任何解析器

请帮忙

【问题讨论】:

  • 供将来参考:Aks unix questions on unix.stackexchange.com。例如,unix.stackexchange.com/questions/114754/… 回答您的问题。 echo 'a,b,c,d,e,f,"gg,hh,ii",j,k' | awk -F\" '{print $2}'
  • sed 's/[^"]*"\([^"]*\).*/\1/' 我在某处读到了这个......我可以修改它以单独删除特定列吗?
  • @Ajit 你能澄清你的问题吗?标题说删除一列,而预期输出显示提取特定列
  • sed 's/[^"]*"//; s/".*//' 适用于给定的示例,但可能不适用于实际用例。您可能需要添加更多示例

标签: csv unix awk sed


【解决方案1】:

Perl 来救援!

perl -MText::CSV_XS=csv -we 'csv(in => shift, fragment => "col=7")' -- file.csv

详情请参阅Text::CSV_XSfragment 选项告诉csv 函数只输出第 7 列。

【讨论】:

  • 无法在 @INC 中找到 Text/CSV_XS.pm(@INC 包含:/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl / usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .)。 BEGIN 失败——编译中止。
【解决方案2】:

你可以用这个:

awk -vFPAT='[^,]*|"[^"]*"' '{print $7}' file.csv

使用FPAT 来定义字段的内容,而不是定义字段分隔符FS(带有-F 选项)。

对于awk 手册页:

FPAT:描述记录中字段内容的正则表达式。设置后,gawk 会将输入解析为字段,其中字段匹配正则表达式,而不是使用 FS 变量的值作为字段分隔符。

【讨论】:

  • 如果双引号也可以包含在带有反斜杠的值中怎么办? a,"b,c","d,\"e\",f"
  • 它不工作..我只得到一个空行作为输出..@oliv
猜你喜欢
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 2010-09-12
  • 2016-06-06
  • 1970-01-01
  • 2018-03-04
相关资源
最近更新 更多