![여러 위치의 2개 열에서 여러 행의 데이터 추출](https://linux55.com/image/109872/%EC%97%AC%EB%9F%AC%20%EC%9C%84%EC%B9%98%EC%9D%98%202%EA%B0%9C%20%EC%97%B4%EC%97%90%EC%84%9C%20%EC%97%AC%EB%9F%AC%20%ED%96%89%EC%9D%98%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EC%B6%94%EC%B6%9C.png)
형식이 매우 잘못된 데이터 파일이 있는데 안타깝게도 결과 파일의 형식을 변경할 수 없습니다. 저는 GAWK를 사용하여 데이터를 관리 가능한 형식으로 구문 분석했지만 이제는 레이아웃이 약간 다른 새로운 파일 세트를 갖게 되었습니다.
아래 예를 사용하여 "Cells" 아래에 표시된 데이터의 처음 두 열의 모든 행을 추출하는 방법이 있는지 알아봐야 합니다. 계속 복사하고 붙여넣을 수 있다는 것을 알고 있지만 getline; print $1,$2
행 수는 2에서 10,000까지 다양할 수 있습니다. 모든 줄을 읽고 숫자 대신 텍스트나 "="가 발견되면 중지하는 루프를 만드는 방법이 있습니까?
전임자. 데이터 세트:
1tally 8 nps = 2000000000
particle(s): neutrons
this tally is modified
cell 20001
energy
0.0000E+00 0.00000E+00 0.0000
1.0000E-05 1.10650E-06 0.0213
1.0000E-03 1.15086E-04 0.0021
1.0000E-01 8.12322E-03 0.0002
1.9231E-01 3.65758E-03 0.0004
2.5000E+00 0.00000E+00 0.0000
total 1.60091E-02 0.0002
===================================================================================================================================
results of 10 statistical checks
1tally 38 nps = 2000000000
particle(s): neutrons
this tally is modified
cell 20001
energy
0.0000E+00 0.00000E+00 0.0000
1.0000E-05 1.10650E-06 0.0213
1.0000E-03 1.15086E-04 0.0021
1.0000E-01 8.12322E-03 0.0002
1.2400E-01 1.20892E-03 0.0006
1.4800E-01 1.00911E-03 0.0007
1.7200E-01 8.39342E-04 0.0008
1.9600E-01 6.99704E-04 0.0008
total 1.60091E-02 0.0002
===================================================================================================================================
results of 10 statistical checks
현재 시도:
/^1tally.*[0-9]/ {print $2};
/^ cell/ {getline; getline; print $1,$2}
전임자. 출력 형식:
8
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.9231E-01 3.65758E-03
2.5000E+00 0.00000E+00
38
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.2400E-01 1.20892E-03
1.4800E-01 1.00911E-03
1.7200E-01 8.39342E-04
1.9600E-01 6.99704E-04
답변1
# print lines from /energy/ to /total/, not inclusive
awk '/total/{p=0};p;/energy/{p=1}' /path/to/input
볼 때는 1로 awk
설정 되고 p
볼 때는 0으로 설정됩니다. 그런 다음 베어 와이어(행 인쇄를 트리거하는 조건)가 인쇄하려는 행에 있게 됩니다./energy/
p
/total/
p
1
원하는 데이터를 정확하게 인쇄하도록 개선할 수 있습니다.
$ awk '/total/{p=0} p==1 {print $1,$2} /energy/{p=1}' input
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.9231E-01 3.65758E-03
2.5000E+00 0.00000E+00
표시될 때 두 번째 필드도 인쇄하려면 /1tally/
특정 트리거를 추가하기만 하면 됩니다.
$ awk '/1tally/ {print $2} /total/{p=0} p==1 {print $1,$2} /energy/{p=1}' input
8
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.9231E-01 3.65758E-03
2.5000E+00 0.00000E+00
각 아웃블록 블록 사이에 빈 줄을 배치하려면 다음을 사용하십시오./total/{p=0; print ""}