데이터 행에 대한 특정 플래그를 기반으로 데이터를 가져오고 이를 사용하여 새 파일을 만드는 방법은 무엇입니까?

데이터 행에 대한 특정 플래그를 기반으로 데이터를 가져오고 이를 사용하여 새 파일을 만드는 방법은 무엇입니까?

나는 다음과 같은 형식으로 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

위의 코드 는 공백을 기준으로 분할하는 .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로 시작하는 줄을 원하지 않는다는 의견이 있기 때문에 이는 샘플 출력과 정확히 일치하지 않습니다.

(*) 적어도 내가 이해할 수 있는 한 최선을 다해. 귀하의 설명은 매우 불분명하고 구문 분석하기 어렵습니다. 해독하는 데 몇 분이 걸렸으며 여전히 그것이 올바른지 확신할 수 없습니다. 당신이 원하는 것이 보기보다 훨씬 더 복잡하거나, 이상하게 복잡한 방식으로 작성했을 수도 있습니다.

관련 정보