我是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](相邻变量和字符串将被连接).