我有一个.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是链A中第30个残基(半胱氨酸)的γ硫。残基可以用三个字母或一个字母表示(此处https://www.iupac.org/publications/pac-2007/1972/pdf/3104x0639.pdf表)。基本上,我只想a)将三个字母的代码更改为一个字母的代码,b)删除链ID(在这种情况下为A),并c)将残数放在一个字母的代码旁边。
我尝试匹配vim中逗号之间的模式。 s%:\(-\d\+\-\)\(\u\+\):\2\1:g
之类的东西给了我c),即(ACYS-30--SG
)。我不知道如何使用vim。我知道如何使用sed和其中包含所有替代命令的输入文件来执行此操作。但是也许用sed完成所有工作可能更好……我问是否可以在vim上进行a)?
谢谢
答案 0 :(得分:2)
这可能对您有用(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
将查找表追加到每行,并使用模式匹配将3个字母代码(和整数值)替换为1个字母代码。查找键是冒号,后跟3个字母键,再跟1个字母代码。
答案 1 :(得分:1)
在给定输入 atoms.csv 的情况下,使用sed
,paste
,cut
和bash
:
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
答案 2 :(得分:1)
如果您知道该怎么做,为什么不利用这些知识而直接从Vim喊出来?
:%!sed -e '<your sed script>'
完成该操作后,您可以在Vim函数中将其弹出。
functioni Transform()
your sed command
endfunction
然后使用
:call Transform()
您可以将其映射到键。
简单!