
Я работаю с данными аэростатов в формате ....
**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 (день) Янв (месяц) 2002 (год) Указывает на новое зондирование в выходном файле 1 дает другую важную информацию, такую как широта, долгота и высота участка 3 Название участка и измерение ветра (м/с) 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
Код .grep
выше основан на функции Raku .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
НТН.
решение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.
Все остальные строки игнорируются.
ПРИМЕЧАНИЕ: Это не совсем соответствует вашему примеру вывода, потому что а) ваш пример вывода не соответствует описанию того, что вы хотите (*) и б) в вашем комментарии указано, что вам не нужны строки, начинающиеся с 2.
(*) По крайней мере, насколько я могу понять. Ваше описание очень неясное и трудно поддается анализу... мне потребовалось несколько минут, чтобы его расшифровать, и я все еще не уверен, что оно верно. Либо то, что вы хотите, гораздо сложнее, чем кажется, либо вы написали это в странной сложной манере.