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

Linux 如何打印此CSV文件中的特定字段?,linux,csv,parsing,awk,Linux,Csv,Parsing,Awk,我试图使用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 但是,如果某些行在括号内包含逗号,则应属

我试图使用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,因为我更熟悉它。如果其他人有任何快速解决方案,请告诉我。谢谢

使用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

另请参见。

使用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

另请参见。

您认为我可以推广此解决方案吗?使用此方法,一行上的字段3可能是另一行上的字段5(例如)。我想能够
awk'{print$1,$2}'
并且所有字段都对应于相同的头。一个文件中一行上的字段3怎么可能是另一行上的字段5?或者您正在询问如何从不同文件的第一行按列名打印字段?如果在这个论坛上有人多次询问和回答,只需在这里搜索档案或谷歌搜索即可。如果你找不到,那就提出一个新的问题。你认为我可以推广这个解决方案吗?使用此方法,一行上的字段3可能是另一行上的字段5(例如)。我想能够
awk'{print$1,$2}'
并且所有字段都对应于相同的头。一个文件中一行上的字段3怎么可能是另一行上的字段5?或者您正在询问如何从不同文件的第一行按列名打印字段?如果在这个论坛上有人多次询问和回答,只需在这里搜索档案或谷歌搜索即可。如果你找不到,那就提出一个新问题。