在VIM中自动将文件拆分为多个文件?

Dar*_*ler 0 vim

我是VIM的新手,我尝试将文件拆分为多个文件.这是一个测试文件:

Something1;XXXword;blabla(about 500 signs);
Something1;XXXword;(about 500 signs);
Something1;YYYword;(about 500 signs);
Something1;RRRword;(about 500 signs);
Run Code Online (Sandbox Code Playgroud)

XXX可能是2到20个字符的单词.当下面的单词(XXX/YYY/RRR)发生变化时,那么在"Something1"之前应该是一个剪辑,并且直到XXX更改的以下行应该是另一个新文件,依此类推.

它应该是这样的:

File1:
Something1;XXXword;blabla(about 500 signs);Something1;XXXword;(about 500 signs);

File2:
Something1;YYYword;(about 500 signs);

File3:
Something1;RRRword;(about 500 signs)
Run Code Online (Sandbox Code Playgroud)

有没有办法像专业人士那样做?谢谢 :)

Pet*_*ker 6

我会推荐一种不同的工具,比如Awk.

awk -F';' '{printf "%s", $0 >> $2}' your_file.txt
Run Code Online (Sandbox Code Playgroud)

这会将每一行拆分成由分隔的列;.每行将附加(>>)到以第二列命名的文件$2(例如XXXword).追加/打印整行,$0除了newline(printf "%s")到新文件,所以一切都是一条长行.

注意:我使用的gawk是您的awk实现,您可能需要根据您的awk实现进行调整.

对于更复杂的场景

在你有以下情况XXX,YYY,XXX:

Something1;XXXword;blabla(about 500 signs);
Something1;YYYword;(about 500 signs);
Something1;XXXword;(about 500 signs);
Run Code Online (Sandbox Code Playgroud)

如果这应该产生3个文件(1个YYY文件和2个XXX文件),那么我们也可以使用Awk:

awk -F';' 'last != $2 {f[$2]++} {printf "%s", $0 >> $2 f[$2]; last = $2}' your_file.txt
Run Code Online (Sandbox Code Playgroud)

这将产生文件:XXXword1,XXXword2,和YYYword1

这类似于上面的awk示例,除了我们使用字典/数组来存储第二列f[$2]++从前一行更改的次数last != $2 {...}.确保last在打印每一行后设置为第二列.将行输出$0到名为after的文件$2 f[$2](相邻变量和字符串将被连接).

  • 问题确实使用了序列"XXX","YYY"和"RRR",并且对于诸如"XXX","YYY","XXX"等情况并不完全明确.在这个问题中,@ Darius Schindler说:"当下面的单词[...]更改[...]应该是另一个新文件""如果这个新序列最终只有两个文件,那么就有一个(复杂的单行内容纯粹用vim脚本. (2认同)