Как переформатировать файл с помощью sed / vim? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть файл .csv, который выглядит следующим образом.

atomnum,atominfo,metric
238,A-30-CYS-SG,53.7723
889,A-115-CYS-SG,46.2914
724,A-94-CYS-SG,44.6405
48,A-6-CYS-SG,37.2108
630,A-80-CYS-SG,29.574
513,A-64-CYS-SG,23.1925
981,A-127-CYS-SG,19.8903
325,A-41-GLN-OE1,17.6205
601,A-76-CYS-SG,17.5079

Я хочу изменить это так:

atomnum,atominfo,metric
238,C30-SG,53.7723
889,C115-SG,46.2914
724,C94-SG,44.6405
48,C6-SG,37.2108
630,C80-SG,29.574
513,C64-SG,23.1925
981,C127-SG,19.8903
325,Q41-OE1,17.6205
601,C76-SG,17.5079

Часть между запятыми представляет собой идентификатор атома: где A-30-CYS-SG - гамма-сера остатка 30, представляющего собой цистеин, в цепи А. Остатки могут быть представлены тремя буквами или только одной ( Таблица здесь https://www.iupac.org/publications/pac-2007/1972/pdf/3104x0639.pdf). По сути, я просто хочу: а) изменить трехбуквенный код на однобуквенный код, б) удалить идентификатор цепи (в данном случае А) и в) поставить номер остатка рядом с одним буквенный код.

Я попытался сопоставить шаблоны между запятыми в vim. Что-то вроде s%:\(-\d\+\-\)\(\u\+\):\2\1:g дает мне в) то есть (ACYS-30--SG). Я не знаю, как это сделать а) с vim. Я знаю, как это сделать с помощью sed и входного файла со всеми командами замены. Но тогда, может быть, лучше сделать всю работу с помощью sed ... Я спрашиваю, возможно ли сделать a) на vim?

Спасибо

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Это может сработать для вас (GNU sed):

sed -r '1b;s/$/\n:ALAA:ARGR:ASNN:ASPD:CYSC:GLUE:GLNQ:GLYG:HISH:ILEI:LEUL:LYSK:METM:PHEF:PROP:SERS:THRT:TRPW:TYRY:VALV/;s/,A-([0-9]+)-(...)(.*)\n.*:\2(.).*/,\4\1\3/' file

Добавьте таблицу поиска к каждой строке и используйте сопоставление с образцом, чтобы заменить трехбуквенный код (и целочисленное значение) однобуквенным кодом. Ключ поиска - это двоеточие, за которым следует трехбуквенный ключ, за которым следует 1-буквенный код.

0 голосов
/ 07 ноября 2018

Если вы знаете, как сделать это в sed, почему бы не использовать эти знания и просто вызвать Vim?

:%!sed -e '<your sed script>'

Как только вы это сделаете и все заработает, вы можете добавить его в функцию Vim.

functioni Transform()
    your sed command
endfunction

, а затем просто используйте

:call Transform()

, который вы можете сопоставить с ключом.

Simples!

0 голосов
/ 07 ноября 2018

Использование sed, paste, cut, & bash, заданный вход atom.csv :

paste -d, <(cut -d, -f1 atoms.csv) \
          <(cut -d, -f2 atoms.csv | sed 's/.-//
                                         s/\(.*\)-\([A-Z]\{3\}\)-/\2\1-/
                                         s/^ALA/A/
                                         s/^ARG/R/
                                         s/^ASN/N/
                                         s/^ASP/D/
                                         s/^CYS/C/
                                         s/^GLU/E/
                                         s/^GLN/Q/
                                         s/^GLY/G/
                                         s/^HIS/H/
                                         s/^ILE/I/
                                         s/^LEU/L/
                                         s/^LYS/K/
                                         s/^MET/M/
                                         s/^PHE/F/
                                         s/^PRO/P/
                                         s/^SER/S/
                                         s/^THR/T/
                                         s/^TRP/W/
                                         s/^TYR/Y/
                                         s/^VAL/V/') \
          <(cut -d, -f3 atoms.csv)

Выход:

atomnum,atominfo,metric
238,C30-SG,53.7723
889,C115-SG,46.2914
724,C94-SG,44.6405
48,C6-SG,37.2108
630,C80-SG,29.574
513,C64-SG,23.1925
981,C127-SG,19.8903
325,Q41-OE1,17.6205
601,C76-SG,17.5079
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...