como posso extrair dados com base em determinados sinalizadores para linhas de dados e criar um novo arquivo com eles

como posso extrair dados com base em determinados sinalizadores para linhas de dados e criar um novo arquivo com eles

Estou trabalhando com dados do Upper Air Balloon com um formato de ....

**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

A coluna 1 é o indicador de tipo de linha (LTI) (LTI) Descrição 254 é o cabeçalho com 0(tempo 0 ou 12Z) 2(dia) Jan(mês) 2002(ano) Indica um novo som no arquivo de saída 1 fornece outras informações importantes informações como latitude e elevação do local 3 Nome do local e medições de vento (m/s) 9 Informações de superfície 4 Nível obrigatório 5 Nível significativo

Tenho um arquivo de texto com todos os dados observados de 2002 a 2019. Cada som no arquivo tem o mesmo formato. Os dados que estou tentando extrair são (LTI) 254 (linha inteira) 1 (linha inteira) 3 (linha inteira) 9 (linha inteira) os dados restantes serão sinalizados pelas colunas 1 e 2 no arquivo que são níveis de pressão de observação obrigatórios 4 1000 e carreira restante 4 925 e carreira restante 4 850 e carreira restante

À medida que você avança, o tempo do arquivo aumenta. Estou procurando gerar um novo arquivo parecido com este

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

Obrigado

Responder1

Usando Raku (anteriormente conhecido como 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

O .grepcódigo acima depende da .wordsfunção do Raku, que se divide em espaços em branco. O código está incluído para capturar linhas começando com " **". O .trim-leadingmétodo remove os espaços em branco iniciais da saída.

Você pode ver que esta solução ocorre em duas etapas. Para eliminar os asteriscos iniciais e terminais, execute o código acima, salve em a tmp_file.txte execute o código abaixo:

~$ 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

Responder2

$ 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

Isso imprime as linhas de entrada onde:

  • $1 é um dos valores permitidos (254, 1, 3 ou 9)
  • $ 1 é 4e$ 2 é 1.000, 925 ou 850.

Todas as outras linhas são ignoradas.

NOTA: Isso não corresponde exatamente ao resultado do seu exemplo porque a) o resultado do seu exemplo não corresponde à descrição do que você deseja (*) eb) seu comentário disse que você não deseja linhas começando com 2.

(*) Pelo menos, tanto quanto posso entender. Sua descrição não é muito clara e difícil de analisar... levei vários minutos para decifrá-la e ainda não tenho certeza se está correta. Ou o que você quer é muito mais complicado do que parece, ou você o escreveu de uma forma bizarramente complicada.

informação relacionada