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

また、vimの代わりにsedを使用する方が速いはずです:

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のソリューションが最適だと思います。そうでなく、文字通り 3 行ごとに結合したい場合は、マクロを使用して簡単にこれを行うことができます。

qqjJxjq

ヒットGしてファイル内の行数を確認し、その回数だけマクロを繰り返します (必要以上に高くてもかまいません)。したがって、ファイルが 1000 行の場合は、1000@q. この種のソリューションは覚えやすく、通常のワークフローに統合できます。

于 2012-08-01T21:42:19.597 に答える