如何按模式将大文件分成两部分?
举个例子file.txt
:
ABC
EFG
XYZ
HIJ
KNL
我想分割这个文件,XYZ
使其file1
包含.XYZ
file2
答案1
这是一份工作csplit
:
csplit -sf file -n 1 large_file /XYZ/
会s
悄悄地分割文件,创建带有前缀的片段f
并file
使用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
, file1
and file2
butfile0
为空,因此您可以安全地删除它:
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
对于现代的,这是上面的基础答案之一的ksh
shell 变体(即没有) :sed
sed
{ 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