我对Vim并不熟悉,但是我正在使用大文本文件(~1G),而我的标准文本编辑并没有削减它。
我的文件目前采用以下格式:
Arbitrary_title_of_sequenceA
SEQ1SEQ1SEQ1SEQ1
SEQ2SEQ2SEQ2SEQ2
Arbitrary_title_of_sequenceB
SEQ1SEQ1SEQ1SEQ1
SEQ2SEQ2SEQ2SEQ2
我需要一种方便的方法将“SEQ2”行添加到“SEQ1”行,如下所示:
Arbitrary_title_of_sequenceA
SEQ1SEQ1SEQ1SEQ1SEQ2SEQ2SEQ2SEQ2
Arbitrary_title_of_sequenceB
SEQ1SEQ1SEQ1SEQ1SEQ2SEQ2SEQ2SEQ2
考虑到这些文件的大小,分别执行每一行并不是一个选择。任何帮助将不胜感激!
答案 0 :(得分:2)
如何开始提供正确的样本?
:g/SEQ1/norm Jx
做你想要的我认为。
:g/SEQ1
是:global
命令,允许您对包含模式SEQ1
的每一行进行操作。请参阅:help :global
。norm
是用于执行普通模式命令的:normal
命令,此处在:g/SEQ1
匹配的每一行上。请参阅:help :normal
。之后出现了正常的命令:
J
用于将当前行与下面的行结合起来。x
用于删除由Vim自动添加的<Space>
。答案 1 :(得分:1)
:1,$s/\(.*\n\)\(.*\)\n\(.*\n\)/\1\2\3/
1,$ -> range is all file
s/PAT1/PAT2/ -> substitute PAT1 with PAT2
.* -> match any character except new line
\n -> match new line
\(PAT1\) -> capture/remember the string that matched PAT1
\1,\2,\3 -> refers to the captured string for captures in order
同样使用sed代替vim应该更快:
sed -i 'n;N;s/\n/ /' input_file
这可以概括为:
Read a line
Read another line and print previous line (n)
Read another line and append it to the previous line (N)
find the first newline and change it to space (s/\n/ /)
print the line (or merged lines)
答案 2 :(得分:0)
我认为romainl的解决方案是最好的如果你有一个可靠的“SEQ1”模式你可以抓住。如果没有,并且您希望逐字加入每个第三行,您可以使用宏轻松地执行此操作:
qqjJxjq
点击G
查看文件中有多少行,然后多次重复宏(无论它高于您的需要都没关系)。因此,如果文件是1000行,则可以1000@q
。这种解决方案易于记忆并集成到您的正常工作流程中。