【问题标题】:Bash: How to grab columns with "delimiter" within the column from CSV file?Bash:如何从 CSV 文件的列中获取带有“分隔符”的列?
【发布时间】:2013-03-18 04:14:32
【问题描述】:

我从在线数据库下载了一些 CSV 文件。我正在尝试减少它们,以便我可以将我需要的部分数据插入到我的 SQL 数据库中。

CSV 文件有逗号分隔的字段,如下所示:

1,Peptidoglycan synthetase ftsI,ftsI,1574687,L42023,P45059,FTSI_HAEIN,"",,,,
3,Histidine decarboxylase,HDC,32109,X54297,P19113,DCHS_HUMAN,,HDC,HDC,HGNC:4855,00817
5,"Glutaminase liver isoform, mitochondrial",GLS2,6650606,AF110330,Q9UI32,GLSL_HUMAN,,GLS2,GLS2,HGNC:29570,05901
6,Coagulation factor XIII A chain,F13A1,182309,M22001,P00488,F13A_HUMAN,1FIE,F13A1,F13A1,HGNC:3531,00604
7,"Nitric oxide synthase, inducible",NOS2,292242,L09210,P35228,NOS2_HUMAN,2NSI,NOS2A,NOS2A,HGNC:7873,01225

这就是问题所在。查看第 3 行和第 5 行。这两行的第二列有逗号!我通常将 awk 用于这样的事情,并且因为逗号在那里 $2 被搞砸了。

例如:

awk -F ',' '{print $2}' myfile.csv ## Obviously I will be printing a lot more stuff

如果如上所示对该部分执行此操作,则第 3 行和第 5 行将被搞砸,因为这两行的第 2 列中有一个逗号,并用引号括起来。

我能做些什么来解决这个问题?

编辑:如果可能的话,我想仍然坚持在 shell 中执行此操作。

【问题讨论】:

  • 当分隔符出现在字段中时(如逗号出现在某些字段中),您需要经过训练的工具来处理 CSV 格式。考虑 Perl 和 Text::CSV,或者可能是 csvfix。如果符合您的口味,Python 或 Ruby 可能有类似的模块。但一般来说,努力使 awk 等工具与 CSV 一起“工作”所导致的白发是不值得的。

标签: bash awk text-parsing


【解决方案1】:

您应该使用像 Text::CSV 之类的 CSV 解析器(如果您愿意,可以使用单线(所以仍然在外壳中)),它将为您完成所有的魔法。

如果您更喜欢,请参阅csv 模块

+ 中的示例:

$ python<<EOF
import csv

f = open("test.csv", 'rt')
try:
    reader = csv.reader(f)
    for row in reader:
        print row
finally:
    f.close()
EOF

【讨论】:

  • 我根本不使用 Perl(使用 Python 和 shell)。我不需要知道一些 Perl 才能使用它吗?
  • 顺便说一句,这是同一个链接。 docs.python.org/2/library/csv.html 我看到了,但如果可以的话,我宁愿坚持使用 shell……你认为 Text::CSV 会更好吗?
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 2023-03-03
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2017-05-08
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多