我有一个名为的文件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