Как напечатать указанные c поля в этом CSV-файле? - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь напечатать определенные c поля в этом CSV-файле, используя awk, но я сталкиваюсь с проблемой, когда некоторые строки содержат запятые, но они не являются новыми полями. Например, следующая строка не проблема для меня.

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, потому что я более знаком с ним. Если у кого-то есть какие-либо быстрые решения, пожалуйста, дайте мне знать. Спасибо!

1 Ответ

0 голосов
/ 31 марта 2020

Использование GNU awk для 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

См. Также Какой самый надежный способ эффективного анализа CSV с использованием awk? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...