
以下を含むファイルがありますtest.txt
。
....Request....
asaksa
sda
dsad
dsad
....Request...
21mklk
nnm212
mkmr543
849238
....Request...
4392840
kndska
94i0-jkfjdk
smdla
.....Request..
839281
ksndlka
nsc
mcxmzl
2つの「要求」パターン間のすべての行を異なる-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