이렇게 입력했는데,
[Data.11]
Store,100,,,,,,,,,,,,,,,,,,,5222
Store,101,,,,,,,,,,,,,,,,,,,5235
[Data.12]
TaxSchedulePt,5899,2,110.0100,99999999.99,,8.8750
TaxSchedulePt,5900,1,0,110.00,,0.0000
[Data.13]
TaxSchedulePt,5900,1,0,110.00,,0.0000
TaxSchedulePt,5900,2,110.0100,99999999.99,,8.8750
먼저 [Data.]는 [Data.] 주어진 입력 파일에서 발견되면 특정 [Data.*] 값을 별도의 파일에 기록해야 합니다.
[Data.11]의 예상 출력 파일
Store,100,,,,,,,,,,,,,,,,,,,5222
Store,101,,,,,,,,,,,,,,,,,,,5235
[Data.12]의 예상 출력 파일
TaxSchedulePt,5899,2,110.0100,99999999.99,,8.8750
TaxSchedulePt,5900,1,0,110.00,,0.0000
[Data.13]의 예상 출력 파일
TaxSchedulePt,5900,1,0,110.00,,0.0000
TaxSchedulePt,5900,2,110.0100,99999999.99,,8.8750
내가 시도한 것은 다음과 같습니다.
filename=$1
Var1=Data.18
if grep -wq "$Var1" $filename ;
then
awk '$1 ~ /Data[.]18/' > /ttk/new/data.dcn
else
echo "not Worked"
fi
답변1
awk 'BEGIN{d=0;p=0} d==1&&/\[Data\.[0-9]+\]/{p=0} p==1{print} /\[Data\.[0-9]+\]/&&d==0{p=1;d=1}'
설명: 하루가 시작될 때 인쇄 부분(p=0)과 데이터 부분(d=0)이 없습니다. p==1이면 라인을 인쇄하고 있는 것입니다. 데이터 라인이 발견되고 아직 데이터 부분을 찾지 못한 경우 인쇄를 켜고 데이터 부분을 찾았음을 기록하십시오. 데이터 섹션을 찾았지만 이미 데이터 섹션을 찾았다면 인쇄를 끄세요.
답변2
만약 i want to print exactly [Data.18] valus only
당신이 말한 대로코멘트귀하의 올바른 요구 사항은 다음과 같습니다(주어진 업데이트된 예제 입력 18
으로 변경됨 ).12
$ awk '{sub(/\r$/,"")} /^\[/{key=$1; next} key=="[Data.12]"' file
TaxSchedulePt,5899,2,110.0100,99999999.99,,8.8750
TaxSchedulePt,5900,1,0,110.00,,0.0000
아니면 If [Data.16] found write a separate file and if [Data.18] was found write a separate file
당신 말대로라면또 다른 댓글그렇다면 올바른 요구 사항은 다음과 같습니다.
$ awk '{sub(/\r$/,"")} /^\[/{close(out); out=$1; next} {print > out}' file
$ head *Data*
==> [Data.11] <==
Store,100,,,,,,,,,,,,,,,,,,,5222
Store,101,,,,,,,,,,,,,,,,,,,5235
==> [Data.12] <==
TaxSchedulePt,5899,2,110.0100,99999999.99,,8.8750
TaxSchedulePt,5900,1,0,110.00,,0.0000
==> [Data.13] <==
TaxSchedulePt,5900,1,0,110.00,,0.0000
TaxSchedulePt,5900,2,110.0100,99999999.99,,8.8750
위의 내용은 이 입력 파일에 대해 실행되었습니다.
$ cat file
[Data.11]
Store,100,,,,,,,,,,,,,,,,,,,5222
Store,101,,,,,,,,,,,,,,,,,,,5235
[Data.12]
TaxSchedulePt,5899,2,110.0100,99999999.99,,8.8750
TaxSchedulePt,5900,1,0,110.00,,0.0000
[Data.13]
TaxSchedulePt,5900,1,0,110.00,,0.0000
TaxSchedulePt,5900,2,110.0100,99999999.99,,8.8750
s는 sub(/\r$/,"")
DOS 줄 끝(OP에 있음)이 있는 줄 끝에서 CR을 제거하는 것입니다. 비록 필드 분할이 발생하여 성능에 작은 영향이 있지만 키에서 공백 뒤에 입력 줄을 사용하는 $1
대신 사용하고 있습니다. $0
값이나 출력은 파일 이름에 포함되지 않습니다.