使用bash脚本将文本文件一分为二

使用bash脚本将文本文件一分为二,bash,text,sed,awk,split,Bash,Text,Sed,Awk,Split,我有一个文本文件,中间有一个标记: one two three blah-blah *MARKER* blah-blah four five six ... 我只需要将这个文件分为两个文件,第一个包含MARKER之前的所有内容,第二个包含MARKER之后的所有内容。它似乎可以在一行与awk或sed一起完成,我只是不知道如何 我尝试了简单的方法-使用,但csplit无法很好地处理Unicode文本。尝试以下方法: awk '/MARKER/{n++}{print >"out" n ".tx

我有一个文本文件,中间有一个标记:

one
two
three
blah-blah *MARKER* blah-blah
four
five
six
...
我只需要将这个文件分为两个文件,第一个包含MARKER之前的所有内容,第二个包含MARKER之后的所有内容。它似乎可以在一行与awk或sed一起完成,我只是不知道如何

我尝试了简单的方法-使用,但csplit无法很好地处理Unicode文本。

尝试以下方法:

awk '/MARKER/{n++}{print >"out" n ".txt" }' final.txt
它将从final.txt读取输入,并生成out1.txt、out2.txt等

sed -n '/MARKER/q;p' inputfile > outputfile1
sed -n '/MARKER/{:a;n;p;ba}' inputfile > outputfile2
或一应俱全:

sed -n -e '/MARKER/! w outputfile1' -e'/MARKER/{:a;n;w outputfile2' -e 'ba}' inputfile

split
命令几乎可以满足您的要求:

$ split -p '\*MARKER\*' splitee 
$ cat xaa
one
two
three
$ cat xab
blah-blah *MARKER* blah-blah
four
five
six
$ tail -n+2 xab
four
five
six
也许它足够满足你的需要了


不过,我不知道使用Unicode是否比csplit做得更好。

使用awk可以轻松做到这一点

awk -vRS="MARKER" '{print $0>NR".txt"}' file

几乎成功了。不会破坏UTF-8,但会在第二个文件中留下标记。您是否尝试过此处所示的解决方案:-它使用
csplit
并按您想要的方式工作,即让标记移出文件。未按说明工作。需要“BEGIN{n=1}”,否则初始文件将命名为“out.txt”,而不是“out1.txt”。与你的笔记相反我试图通过编辑添加此内容,但被拒绝。+1:loove。如此简洁优雅。我一直需要它来丢弃日志中的大部分垃圾,这些垃圾来自配置不好的构建脚本;我想你用的是某种口味的BSD。在任何情况下,在基于GNU的操作系统(如大多数Linux发行版)上,coreutils同时包含split和csplit,因此它们应该具有类似的Unicode行为。