我希望重新排列该长文件中ATOM记录后3位数列中的记录,使其从“ 1”而不是“ 534”开始。每行代表一个大型蛋白质文件中的一个原子。我可以选择带有可视块(ctrl + v)的文本块,但不确定接下来要做什么。我搜索了类似的问题,但建议的代码不起作用。
我正在使用VIM编辑器,恐怕不太熟悉编码。
例如。有人建议选择块,然后使用“:I”(无效)。其他建议:选择块,然后使用“ ctrl + a”(不起作用)。任何人都有正确的VIM方法吗? 非常感谢
ATOM 534 C ACE A 0 10.207 22.900 174.325 1.00 0.00 C
ATOM 535 O ACE A 0 10.093 22.142 173.352 1.00 0.00 O
ATOM 536 CA ACE A 0 11.342 22.737 175.312 1.00 0.00 C
ATOM 1 N PRO A 1 9.225 23.976 174.522 1.00 32.27 N
ATOM 2 CA PRO A 1 8.230 23.902 173.411 1.00 32.77 C
ATOM 3 C PRO A 1 8.827 23.261 172.170 1.00 30.28 C
答案 0 :(得分:1)
这是您可以做的。
给出此文本文件:
$ cat file
Eg. Someone suggested selecting the block then use ":I" (didn't work). Other suggestion: select block then use "ctrl+a" (didn't work). Would anyone have the correct VIM method by any chance? Many thanks
ATOM 534 C ACE A 0 10.207 22.900 174.325 1.00 0.00 C
ATOM 535 O ACE A 0 10.093 22.142 173.352 1.00 0.00 O
ATOM 536 CA ACE A 0 11.342 22.737 175.312 1.00 0.00 C
ATOM 1 N PRO A 1 9.225 23.976 174.522 1.00 32.27 N
ATOM 2 CA PRO A 1 8.230 23.902 173.411 1.00 32.77 C
ATOM 3 C PRO A 1 8.827 23.261 172.170 1.00 30.28 C
Hi there just more stuff in the file.
在vim中打开文件...
现在键入
:2,7!sort -k2 -n
点击进入,您应该看到……
然后:wq
就可以了!
答案 1 :(得分:0)
要用递增的数字代替,我们可以使用寄存器作为计数器;由于setreg()
成功返回0,我们可以纯粹出于表达式中的副作用调用它,作为:help sub-replace-expression
的一部分。
:let @a = 1 | %s/^ATOM \+\zs\d\+/\=@a + setreg('a', @a + 1)/g
该模式断言(用:help /\zs
)在数字前面有ATOM
,以避免其他匹配。
如果您希望在数字变化的情况下保持相同的宽度,则需要进行以下更改:
:help printf()
用于数字(%3d
)的右对齐固定宽度格式:let @a = 1 | %s/^ATOM \zs\s*\d\+/\=printf('%3d', @a + setreg('a', @a + 1))/g
答案 2 :(得分:0)
您可以尝试以下操作:
Ctrl-v ..........................Select the block with the numbers
:'<,'>s/\d+/1 ...................Substitute all numbers by 1
gv ..............................Repeat the selection
o ...............................jump to the beginning of the selection
j ...............................goes to the seccond line
g Ctrl-a.........................increase the numbers
OBS:如果您已经选择了范围,请使用gv
重新选择,然后进行替换,然后重新选择并使用g Ctrl-a
。有关帮助系统:h g_Ctrl-a
我使用j
来不增加第一个数字
如果出现问题,请键入:
:e!
这将使缓冲区处于打开状态。