按照某种模式将文件分成两部分

按照某种模式将文件分成两部分

如何按模式将大文件分成两部分?

举个例子file.txt

ABC
EFG
XYZ
HIJ
KNL

我想分割这个文件,XYZ使其file1包含.XYZfile2

答案1

这是一份工作csplit:

csplit -sf file -n 1 large_file /XYZ/

s悄悄地分割文件,创建带有前缀的片段ffile使用n单个数字进行编号,例如file0等。请注意,使用/regex/将分割到但不包括匹配的行regex。拆分为包括行匹配regex添加+1偏移量:

csplit -sf file -n 1 large_file /XYZ/+1

这将创建两个文件, file0并且file1.如果您绝对需要命名它们file1,并且file2可以随时向csplit命令添加空模式并删除第一个文件:

csplit -sf file -n 1 large_file // /XYZ/+1

创建file0, file1and file2butfile0为空,因此您可以安全地删除它:

rm -f file0

答案2

awk你一起可以做到:

awk '{print >out}; /XYZ/{out="file2"}' out=file1 largefile


解释:第一个awk参数 ( ) 定义一个带有文件名的变量,该变量将在处理out=file1后续参数 ( ) 时用于输出。largefile程序将把所有行打印到变量( )awk指定的文件中。如果找到该模式,则输出变量将被重新定义为指向新文件 ( ),该文件将用作打印后续数据行的目标。out{print >out}XYZ{out="file2}"

参考:

答案3

对于现代的,这是上面的基础答案之一的kshshell 变体(即没有) :sedsed

{ read in <##XYZ ; print "$in" ; cat >file2 ;} <largefile >file1


还有另一个ksh单独的变体(即也省略了cat):

{ read in <##XYZ ; print "$in" ; { read <##"" ;} >file2 ;} <largefile >file1


(纯ksh解决方案似乎性能相当高;在 2.4 GB 测试文件上,它需要 19-21 秒,而基于sed/cat的方法需要 39-47 秒)。

答案4

使用 GNU sed 试试这个:

sed -n -e '1,/XYZ/w file1' -e '/XYZ/,${/XYZ/d;w file2' -e '}' large_file

相关内容