¿Cómo puedo extraer datos basados ​​en ciertos indicadores para filas de datos y crear un nuevo archivo con ellos?

¿Cómo puedo extraer datos basados ​​en ciertos indicadores para filas de datos y crear un nuevo archivo con ellos?

Estoy trabajando con datos de Upper Air Balloon con un 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

La columna 1 es el indicador de tipo de línea (LTI) (LTI) Descripción 254 es el encabezado con 0 (hora 0 o 12Z) 2 (día) enero (mes) 2002 (año) Indica un nuevo sonido en el archivo de salida 1 proporciona otros importantes información como latitud y elevación del sitio 3 Nombre del sitio y medidas del viento (m/s) 9 Información de la superficie 4 Nivel obligatorio 5 Nivel significativo

Tengo un archivo de texto con todos los datos observados desde 2002 hasta 2019. Cada sondeo en el archivo tiene el mismo formato. Los datos que estoy intentando extraer son (LTI) 254 (fila completa) 1 (fila completa) 3 (fila completa) 9 (fila completa) los datos restantes se marcarán en las columnas 1 y 2 del archivo, que son niveles de presión de observación obligatorios. 4 1000 y fila restante 4 925 y fila restante 4 850 y fila restante

A medida que avanza por el archivo, el tiempo aumenta. Estoy buscando generar un nuevo archivo similar a 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

Gracias

Respuesta1

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

El .grepcódigo anterior se basa en la función de Raku .words, que se divide en espacios en blanco. Se incluye código para capturar líneas que comienzan con " **". El .trim-leadingmétodo elimina los espacios en blanco iniciales de la salida.

Puede ver que esta solución se desarrolla en dos pasos. Para recortar los asteriscos iniciales y terminales, ejecute el código anterior, guárdelo en un archivo tmp_file.txty luego ejecute el código siguiente:

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

Respuesta2

$ 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

Esto imprime las líneas de entrada donde:

  • $1 es uno de los valores permitidos (254, 1, 3 o 9)
  • $1 es 4y$2 son 1000, 925 u 850.

Todas las demás líneas se ignoran.

NOTA: Esto no coincide exactamente con su resultado de muestra porque a) su resultado de muestra no coincide con la descripción de lo que desea (*) y b) su comentario decía que no desea líneas que comiencen con 2.

(*) Al menos, lo mejor que puedo entender. Su descripción es muy confusa y difícil de analizar... me tomó varios minutos descifrarla y todavía no estoy seguro de que sea correcta. O lo que quieres es mucho más complicado de lo que parece, o lo has escrito de una manera extrañamente complicada.

información relacionada