2

我对 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

考虑到这些文件的大小,单独执行每一行并不是一个真正的选择。任何帮助将非常感激!

4

3 回答 3

2

一开始就提供正确的样品怎么样?

:g/SEQ1/norm Jx

我认为你想要的。

  • :g/SEQ1:global允许您对包含模式的每一行执行操作的命令SEQ1。见:help :global
  • norm:normal您用来执行正常模式命令的命令,在此处与:g/SEQ1. 见:help :normal

之后是有问题的正常命令:

  • J用于将当前行与下面的行连接起来。
  • x用于删除<Space>Vim 自动添加的。
于 2012-08-01T21:33:29.020 回答
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)
于 2012-08-01T20:15:58.553 回答
0

如果你有一个可靠的“SEQ1”模式,我认为 romainl 的解决方案是最好的。如果没有,并且您想从字面上加入每三行,您可以使用宏轻松地做到这一点:

qqjJxjq

点击G查看文件中有多少行,然后重复多次宏(它比你需要的高并不重要)。因此,如果文件是 1000 行,您可以这样做1000@q。这种解决方案很容易记住并集成到您的正常工作流程中。

于 2012-08-01T21:42:19.597 回答