Shell 使用bash:如何根据输入的文件行内容分割文件?
我有一些大的文本日志文件。内容如下:Shell 使用bash:如何根据输入的文件行内容分割文件?,shell,file,split,Shell,File,Split,我有一些大的文本日志文件。内容如下: Begin to work Load library Start TEXTLOG Checking ok TEXTLOG Start process Starting node ok TEXTLOG Stop node TEXTLOG 在该文件中,行“TEXTLOG”用作delimeter,因此我希望将该文件拆分为几个较小的文件,使用“TEXTLOG”作为EOF指示符,因此我应该: 文件1: Begin to work Load library Start
Begin to work
Load library
Start
TEXTLOG
Checking
ok
TEXTLOG
Start process
Starting node
ok
TEXTLOG
Stop node
TEXTLOG
在该文件中,行“TEXTLOG”用作delimeter,因此我希望将该文件拆分为几个较小的文件,使用“TEXTLOG”作为EOF指示符,因此我应该:
文件1:
Begin to work
Load library
Start
文件2:
Checking
ok
文件3:
Start process
Starting node
ok
文件4:
Stop node
如何使用shell实现这一点?
谢谢。试试这个:
awk 'BEGIN{c=1}/^TEXTLOG/{c++;next} {print > "file"c}' file
ls
试试这个:
awk 'BEGIN{c=1}/^TEXTLOG/{c++;next} {print > "file"c}' file
ls
使用GNU awk:
awk -v RS="\nTEXTLOG\n" '{print > "file"++c}' file
RS
是记录分隔符,允许立即获取每个文件的内容。使用GNU awk:
awk -v RS="\nTEXTLOG\n" '{print > "file"++c}' file
RS
是记录分隔符,允许立即获取每个文件的内容。使用csplit:
csplit --suppress-matched file "/TEXTLOG/" "{*}"
确保输出中不包含文本日志分隔符--suppress matched
告诉csplit不仅要运行一次匹配模式,还要在整个文件中运行“{*}”
csplit --suppress-matched file "/TEXTLOG/" "{*}"
确保输出中不包含文本日志分隔符--suppress matched
告诉csplit不仅要运行一次匹配模式,还要在整个文件中运行“{*}”
csplit--version
为我提供了csplit(GNU coreutils)8.28
。似乎我在linux/mac上的csplit不支持--suppress匹配。你是怎么尝试的?我正在运行Ubuntu18.04csplit——版本
提供了csplit(GNUCoreutils)8.28
。