首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何打印此CSV文件中的特定字段?

如何打印此CSV文件中的特定字段?
EN

Stack Overflow用户
提问于 2020-03-31 06:20:16
回答 1查看 36关注 0票数 1

我试图使用awk打印这个CSV文件中的特定字段,但遇到了一个问题,其中一些行包含逗号,但它们不是新字段。例如,下面这行对我来说不成问题。

代码语言:javascript
运行
复制
ABAKEV,InChI=1S/C10H7NO/c12-7-9-6-5-8-3-1-2-4-10(8)11-9/h1-7H,8,2,H7C10ON,1562.9152

我使用:

代码语言:javascript
运行
复制
awk -F "," '{print $1,$3,$5,$6}'

这给了我想要的结果:

代码语言:javascript
运行
复制
ABAKEV 8 H7C10ON 1562.9152

但是,当有一些行在括号中包含逗号,而这些行应该属于第二个字段时。例如:

代码语言:javascript
运行
复制
ACEMID03,InChI=1S/C2H5NO/c1-2(3)4/h1H3,(H2,3,4),18,1,H5C2ON,1491.2031,-,308.5,158.19,CC(=O)N,10.87831,3.89183,54.21

具体来说,

代码语言:javascript
运行
复制
(H2,3,4)

我想要的结果是:

代码语言:javascript
运行
复制
ACEMID03 18 H5C2ON 1491.2031

有没有人有什么想法可以让我以我想要的方式来分解这件事?我更喜欢使用awk,因为我对它更熟悉。如果其他人有任何快速的解决方案,请让我知道。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-31 06:37:03

使用GNU awk for FPAT来标识字段:

代码语言:javascript
运行
复制
$ awk -v FPAT='[^,]+|[(][^()]+)' '{for (i=1; i<=NF; i++) print i, $i}' file
1 ACEMID03
2 InChI=1S/C2H5NO/c1-2(3)4/h1H3
3 (H2,3,4)
4 18
5 1
6 H5C2ON
7 1491.2031
8 -
9 308.5
10 158.19
11 CC(=O)N
12 10.87831
13 3.89183
14 54.21

代码语言:javascript
运行
复制
$ awk -v FPAT='[^,]+|[(][^()]+)' '{print $1,$3,$5,$6}' file
ACEMID03 (H2,3,4) 1 H5C2ON

另请参见What's the most robust way to efficiently parse CSV using awk?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60940460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档