将文本文件的搜索模式之间的所有行打印到不同的文件

将文本文件的搜索模式之间的所有行打印到不同的文件

我有一个名为的文件test.txt,其中包含:

....Request....
asaksa
sda
dsad
dsad
....Request...
21mklk
nnm212
mkmr543
849238
....Request...
4392840
kndska
94i0-jkfjdk
smdla
.....Request..
839281
ksndlka
nsc
mcxmzl

我希望两个“请求”模式之间的所有行都应打印到不同的 -2 文件,例如:

文件1:

asaksa
sda
dsad
dsad

文件2:

21mklk
nnm212
mkmr543
849238

文件3:

4392840
kndska
94i0-jkfjdk
smdla

文件4:

839281
ksndlka
nsc
mcxmzl

同样地

答案1

每次遇到Request字符串时增加文件计数器怎么样?

awk '/Request/ {n++; next}; {print > "file"n}' test.txt

答案2

csplit -f file -z --suppress-matched - '/Request/' '{*}' <<\DATA
....Request....
asaksa
sda
dsad
dsad
....Request...
21mklk
nnm212
mkmr543
849238
....Request...
4392840
kndska
94i0-jkfjdk
smdla
.....Request..
839281
ksndlka
nsc
mcxmzl
DATA

基本上,您是在询问如何使用csplit。它的工作是根据上下文匹配将其输入文件拆分为单独的文件。

ls 

file00  file01  file02  file03

cat file00

asaksa
sda
dsad
dsad

cat file*

asaksa
sda
dsad
dsad
21mklk
nnm212
mkmr543
849238
4392840
kndska
94i0-jkfjdk
smdla
839281
ksndlka
nsc
mcxmzl

答案3

或者使用内置变量NR作为记录编号:

awk -v RS='\\.+Request\\.+'  '{if (NR==1) next}  {print > "file"NR-1 }' test.txt

并且不会为file1.

这个稍长的文件删除了每个输出文件开头和结尾的空行:

awk -v RS='\\.+Request\\.+' -v ORS= '{if (NR==1) next}  { gsub("^\n",""); print > "file"NR-1 }' test.txt

相关内容