
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 .grep
có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-leading
mé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.txt
y 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.
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.