나는 다음 문서를 가지고 있습니다:-
====== 20160606:034441 ====== Mango(Test)
TestName MangoT
Row 0
Season N
Name Safeda
Location Delhi
====== 20160606:034441 ====== Mango(Result)
TestName MangoR
Result 0
No_of_Mango 13
Quantity 2
Quantity 3
Quantity 6
Quantity 0
Quantity 1
Quantity 9
Quantity 54
Quantity 2
Quantity 4
Quantity 6
Quantity 76
Quantity 0
Quantity 99
Price 50
Price 70
Price 40
Price 30
Price 40
Price 30
Price 20
Price 60
Price 70
Price 80
Price 90
Price 30
Price 30
====== 20160606:034441 ====== Mango(Test)
TestName MangoT
Row 0
Season N
Name Alphonso
Location Mumbai
====== 20160606:034441 ====== Mango(Result)
TestName MangoR
Result 0
No_of_Mango 13
Quantity 5
Quantity 3
Quantity 1
Quantity 0
Quantity 7
Quantity 8
Quantity 70
Quantity 3
Quantity 23
Quantity 43
Quantity 734
Quantity 2
Quantity 929
Price 50
Price 70
Price 40
Price 30
Price 40
Price 30
Price 20
Price 60
Price 70
Price 80
Price 90
Price 30
Price 30
이제 위 파일의 Mango 이름을 기반으로 하는 두 개의 입력 파일이 필요합니다. 예를 들면 다음과 같습니다.- 파일 이름:-safeda.txt
TestName MangoR
Result 0
No_of_Mango 13
Quantity 2
Quantity 3
Quantity 6
Quantity 0
Quantity 1
Quantity 9
Quantity 54
Quantity 2
Quantity 4
Quantity 6
Quantity 76
Quantity 0
Quantity 99
Price 50
Price 70
Price 40
Price 30
Price 40
Price 30
Price 20
Price 60
Price 70
Price 80
Price 90
Price 30
Price 30
두 번째 파일 이름:-Alphonso.txt
TestName MangoR
Result 0
No_of_Mango 13
Quantity 5
Quantity 3
Quantity 1
Quantity 0
Quantity 7
Quantity 8
Quantity 70
Quantity 3
Quantity 23
Quantity 43
Quantity 734
Quantity 2
Quantity 929
Price 50
Price 70
Price 40
Price 30
Price 40
Price 30
Price 20
Price 60
Price 70
Price 80
Price 90
Price 30
Price 30
쉘 스크립트를 사용하여 이 두 파일을 생성해야 합니다.
답변1
한 가지 방법은 다음과 같습니다.
$ awk '(/=====/){a=0}
(/\(Result\)\s*$/){a=1; next}
($1=="Name"){n=$2}
(a==1){print >> n".txt"}' file
설명하다
(/=====/){a=0}
: 현재 행이 일치하는 경우 로======
설정됩니다 .a
0
(/\(Result\)\s*$/){a=1; next}: if the current line ends with
(결과) 1`followed by 0 or more whitespace, set
을 입력to
하고 다음 줄로 점프합니다.($1=="Name"){n=$2}
: 첫 번째 필드가 이면 변수를 두 번째 필드의 값으로Name
설정합니다 .n
(a==1){print >> n".txt"
:a
그렇다면 확장자가 (name)인 파일에 이 줄을 인쇄합니다1
.n
.txt
답변2
#!/bin/bash
filename=""
do_write=0
while read line
do
case $line in
==*Result*) do_write=1
;;
==*Test*) do_write=0
filename=""
;;
Name*) [[ $do_write == 0 ]] && filename=${line#Name }.txt
;;
"") # Skip blank lines
;;
*) [[ $do_write == 1 ]] && echo "$line" >> $filename
esac
done
입력 파일을 사용하십시오.
$ head -10 input
====== 20160606:034441 ====== Mango(Test)
TestName MangoT
Row 0
Season N
Name Safeda
Location Delhi
====== 20160606:034441 ====== Mango(Result)
TestName MangoR
Result 0
결과는 다음과 같습니다.
$ ./parse < input
$ ls
Alphonso.txt input parse Safeda.txt
$ head Alphonso.txt
TestName MangoR
Result 0
No_of_Mango 13
Quantity 5
Quantity 3
Quantity 1
Quantity 0
Quantity 7
Quantity 8
Quantity 70
$ head Safeda.txt
TestName MangoR
Result 0
No_of_Mango 13
Quantity 2
Quantity 3
Quantity 6
Quantity 0
Quantity 1
Quantity 9
Quantity 54