데이터 행의 특정 플래그를 기반으로 데이터를 추출하고 이를 사용하여 새 파일을 생성하려면 어떻게 해야 합니까?

데이터 행의 특정 플래그를 기반으로 데이터를 추출하고 이를 사용하여 새 파일을 생성하려면 어떻게 해야 합니까?

고고도 풍선 데이터를 형식으로 작업하고 있습니다....

**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(Line Type Indicator) 설명 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

위의 코드는 공백을 기준으로 분할하는 .grepRaku의 기능을 사용합니다 . " "로 시작하는 줄을 .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.

https://raku.org

답변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로 시작하는 줄을 원하지 않는다고 나와 있기 때문에 이는 예제 출력과 정확히 일치하지 않습니다.

(*) 적어도 제가 이해하는 한 최선을 다하겠습니다. 귀하의 설명은 매우 불분명하고 구문 분석하기 어렵습니다. 해독하는 데 몇 분이 걸렸지만 여전히 올바른지 확실하지 않습니다. 보이는 것보다 더 복잡해지길 원하거나 엄청나게 복잡한 방식으로 작성했습니다.

관련 정보