다음을 포함 하는 파일이 있습니다 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