
나는 다음과 같은 형식으로 Upper Air Balloon 데이터를 작업하고 있습니다.
**254 12 1 JAN 2002
1 94703 72501 40.87N 72.87W 20 1116**
2 100 100 250 40 32767 3
**3 OKX 32767 ms**
**9 1014 20 -105 -130 310 5**
5 1008 66 -71 -91 32767 32767
**4 1000 131 -45 -95 315 20**
5 946 565 -63 -143 32767 32767
**4 925 741 -75 -155 20 36**
5 865 1257 -117 -177 32767 32767
**4 850 1393 -117 -197 290 56**
5 839 1493 -107 -187 32767 32767
5 757 2276 -151 -221 32767 32767
5 745 2396 -143 -303 32767 32767
5 727 2581 -145 -285 32767 32767
4 700 2869 -161 -301 275 190
5 693 2944 -165 -325 32767 32767
5 676 3130 -175 -285 32767 32767
5 668 3219 -179 -359 32767 32767
5 651 3411 -191 -271 32767 32767
5 595 4076 -219 -279 32767 32767
5 574 4338 -225 -305 32767 32767
5 557 4558 -229 -429 32767 32767
4 500 5350 -285 -455 260 324
5 459 5955 -333 -483 32767 32767
5 438 6281 -359 -459 32767 32767
5 430 6408 -367 -447 32767 32767
5 420 6571 -365 -485 32767 32767
4 400 6910 -387 -537 255 401
5 370 7439 -429 -559 32767 32767
5 361 7605 -427 -567 32767 32767
4 300 8830 -521 -631 250 483
5 279 9295 -553 -653 32767 32767
4 250 9990 -569 -679 250 550
5 236 10354 -569 -689 32767 32767
4 200 11410 -539 -729 255 545
5 189 11772 -537 -737 32767 32767
4 150 13250 -559 -789 260 581
5 139 13731 -581 -811 32767 32767
4 100 15790 -623 -843 255 380
254 0 2 JAN 2002
1 94703 72501 40.87N 72.87W 20 2305
2 100 179 263 26 32767 3
3 OKX 32767 ms
9 1016 20 -13 -113 320 36
4 1000 150 -13 -123 320 72
4 925 764 -71 -141 320 144
5 873 1210 -113 -152 32767 32767
4 850 1416 -125 -185 340 164
5 836 1542 -129 -239 32767 32767
5 787 2002 -119 -289 32767 32767
4 700 2892 -173 -353 310 164
5 577 4313 -253 -423 32767 32767
5 557 4569 -235 -435 32767 32767
5 536 4848 -257 -377 32767 32767
4 500 5350 -291 -401 285 344
5 442 6217 -357 -507 32767 32767
4 400 6910 -389 -569 275 416
4 300 8850 -477 -677 270 607
4 250 10040 -521 -711 265 602
5 219 10891 -539 -739 32767 32767
5 215 11010 -511 -731 32767 32767
4 200 11480 -533 -753 260 581
4 150 13320 -563 -803 32767 32767
5 109 15314 -623 -843 32767 32767
4 100 15850 -621 -841 265 669
열 1은 회선 유형 표시기(LTI)입니다. (LTI) 설명 254는 헤더입니다. 0(시간 0 또는 12Z) 2(일) Jan(월) 2002(년) 출력 파일의 새로운 소리를 나타냅니다. 1은 다른 중요한 내용을 제공합니다. 사이트 위도 및 사이트 고도와 같은 정보 3 사이트 이름 및 바람 측정값(m/s) 9 표면 정보 4 필수 수준 5 중요 수준
2002년부터 2019년까지 관찰된 모든 데이터가 포함된 텍스트 파일이 있습니다. 파일의 각 소리는 동일한 형식입니다. 추출하려는 데이터는 (LTI) 254(전체 행) 1(전체 행) 3(전체 행) 9(전체 행)입니다. 나머지 데이터는 필수 관찰 압력 수준인 파일의 열 1과 2로 플래그가 지정됩니다. 4 1000 및 나머지 행 4 925 및 나머지 행 4 850 및 나머지 행
아래로 내려갈수록 파일 시간이 늘어납니다. 다음과 같은 새 파일로 출력하려고 합니다.
254 12 1 JAN 2002
1 94703 72501 40.87N 72.87W 20 1116
3 OKX 32767 ms
9 1014 20 -105 -130 310 5
4 1000 131 -45 -95 315 20
4 925 741 -75 -155 20 36
4 850 1393 -117 -197 290 56
254 0 2 JAN 2002
1 94703 72501 40.87N 72.87W 20 2305
2 100 179 263 26 32767 3
9 1016 20 -13 -113 320 36
4 1000 150 -13 -123 320 72
4 925 764 -71 -141 320 144
4 850 1416 -125 -185 340 164
감사합니다
답변1
Raku(이전의 Perl6) 사용
~$ raku -ne '.trim-leading.put if .words[0].grep(rx/"**"? <(254 | 1 | 3 | 9)> /) | (.words[0].grep("4" | "**4") && .words[1].grep(rx/1000 | 925 | 850 /)) ;' UABalloon.txt
**254 12 1 JAN 2002
1 94703 72501 40.87N 72.87W 20 1116**
**3 OKX 32767 ms**
**9 1014 20 -105 -130 310 5**
**4 1000 131 -45 -95 315 20**
**4 925 741 -75 -155 20 36**
**4 850 1393 -117 -197 290 56**
254 0 2 JAN 2002
1 94703 72501 40.87N 72.87W 20 2305
3 OKX 32767 ms
9 1016 20 -13 -113 320 36
4 1000 150 -13 -123 320 72
4 925 764 -71 -141 320 144
4 850 1416 -125 -185 340 164
위의 코드 는 공백을 기준으로 분할하는 .grep
Raku의 .words
기능을 사용합니다. " "로 시작하는 줄을 캡처하는 코드가 포함되어 있습니다 **
. 이 .trim-leading
메서드는 출력에서 선행 공백을 제거합니다.
이 솔루션이 두 단계로 진행되는 것을 볼 수 있습니다. 초기 및 터미널 별표를 잘라내려면 위 코드를 실행하고 에 저장한 tmp_file.txt
후 아래 코드를 실행하세요.
~$ raku -pe 's:g/ \** (.+?) \** /$0/;' tmp.txt
254 12 1 JAN 2002
1 94703 72501 40.87N 72.87W 20 1116
3 OKX 32767 ms
9 1014 20 -105 -130 310 5
4 1000 131 -45 -95 315 20
4 925 741 -75 -155 20 36
4 850 1393 -117 -197 290 56
254 0 2 JAN 2002
1 94703 72501 40.87N 72.87W 20 2305
3 OKX 32767 ms
9 1016 20 -13 -113 320 36
4 1000 150 -13 -123 320 72
4 925 764 -71 -141 320 144
4 850 1416 -125 -185 340 164
HTH.
답변2
$ awk '$1 ~ /^(254|1|3|9)$/ || ($1 == 4 && $2 ~ /^(1000|925|850)$/)' input.txt
254 12 1 JAN 2002
1 94703 72501 40.87N 72.87W 20 1116
3 OKX 32767 ms
9 1014 20 -105 -130 310 5
4 1000 131 -45 -95 315 20
4 925 741 -75 -155 20 36
4 850 1393 -117 -197 290 56
254 0 2 JAN 2002
1 94703 72501 40.87N 72.87W 20 2305
3 OKX 32767 ms
9 1016 20 -13 -113 320 36
4 1000 150 -13 -123 320 72
4 925 764 -71 -141 320 144
4 850 1416 -125 -185 340 164
그러면 다음 중 하나의 입력 줄이 인쇄됩니다.
- $1은 허용되는 값(254, 1, 3 또는 9) 중 하나입니다.
- 1달러는 4이다그리고2달러는 1000, 925, 850입니다.
다른 모든 줄은 무시됩니다.
참고: a) 샘플 출력이 원하는 설명(*)과 일치하지 않고(*) b) 2로 시작하는 줄을 원하지 않는다는 의견이 있기 때문에 이는 샘플 출력과 정확히 일치하지 않습니다.
(*) 적어도 내가 이해할 수 있는 한 최선을 다해. 귀하의 설명은 매우 불분명하고 구문 분석하기 어렵습니다. 해독하는 데 몇 분이 걸렸으며 여전히 그것이 올바른지 확신할 수 없습니다. 당신이 원하는 것이 보기보다 훨씬 더 복잡하거나, 이상하게 복잡한 방식으로 작성했을 수도 있습니다.