我试图使用awk打印这个CSV文件中的特定字段,但遇到了一个问题,其中一些行包含逗号,但它们不是新字段。例如,下面这行对我来说不成问题。
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
我使用:
awk -F "," '{print $1,$3,$5,$6}'
这给了我想要的结果:
ABAKEV 8 H7C10ON 1562.9152
但是,当有一些行在括号中包含逗号,而这些行应该属于第二个字段时。例如:
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
具体来说,
(H2,3,4)
我想要的结果是:
ACEMID03 18 H5C2ON 1491.2031
有没有人有什么想法可以让我以我想要的方式来分解这件事?我更喜欢使用awk,因为我对它更熟悉。如果其他人有任何快速的解决方案,请让我知道。谢谢!
发布于 2020-03-31 06:37:03
使用GNU awk for FPAT来标识字段:
$ 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
。
$ 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?。
https://stackoverflow.com/questions/60940460
复制相似问题