我是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)
有没有办法像专业人士那样做?谢谢 :)
我会推荐一种不同的工具,比如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]
(相邻变量和字符串将被连接).