使用Bash脚本将文本文件拆分为两个

8

我可以帮助您进行翻译。以下是关于IT技术的内容:

我有一个文本文件,在中间某个位置有一个标记:

one
two
three
blah-blah *MARKER* blah-blah
four
five
six
...

我只需要把这个文件分成两个文件,第一个文件包含MARKER之前的所有内容,第二个文件包含MARKER之后的所有内容。看起来可以用awk或sed在一行中完成,我只是想不出怎么实现。
我尝试了简单的方法-使用csplit,但csplit与Unicode文本不兼容。
4个回答

12

您可以使用awk轻松完成此操作

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

+1:太喜欢了。如此简洁优雅。我一直需要这个来丢弃日志中来自配置不良的构建脚本的大量垃圾。 - Rekin

5

试试这个:

awk '/MARKER/{n++}{print >"out" n ".txt" }' final.txt

它将从final.txt读取输入,并生成out1.txt、out2.txt等输出文件...

几乎成功了。不会弄乱UTF-8,但是在第二个文件中留下了MARKER - Sergey Kovalev
你尝试过这里展示的解决方案吗:http://www.unix.com/shell-programming-scripting/41060-split-file-into-seperate-files.html - 它使用 csplit 并按照你想要的方式工作,即将标记排除在文件之外。 - Leniel Maccaferri
不按照描述工作。需要添加“BEGIN {n = 1}”否则初始文件将被命名为“out.txt”,而不是“out1.txt”。与您的注释相反。 - 我尝试通过编辑添加此内容,但被拒绝了。 - StackzOfZtuff

3
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

1

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 更好。

在GNU coreutils中包含的split版本中似乎没有该选项;我猜你正在使用某种BSD。无论如何,在大多数Linux发行版等基于GNU的操作系统中,coreutils都包括split和csplit,因此它们应该具有类似的Unicode行为。 - Daniel H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接