如何使用sed / vim重新格式化文件?

时间:2018-11-06 22:26:04

标签: csv vim sed

我有一个.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)?

谢谢

3 个答案:

答案 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 的情况下,使用sedpastecutbash

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()

您可以将其映射到键。

简单!