我如何根据数据行的某些标志提取数据并用它们创建一个新文件

我如何根据数据行的某些标志提取数据并用它们创建一个新文件

我正在处理格式为 .... 的高空气球数据。

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

上面的代码.grep依赖于 Raku 的.words函数,该函数根据空格进行分割。包含的代码用于捕获以“ **”开头的行。该.trim-leading方法从输出中删除前导空格。

您可以看到此解决方案分两步进行。要删除开头和结尾的星号,请运行上面的代码,保存到 a 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 美元等于 42 美元可以是 1000、925 或 850。

所有其他行都将被忽略。

注意:这与您的示例输出不完全匹配,因为a)您的示例输出与您想要的描述不匹配(*)和b)您的评论说您不希望以2开头的行。

(*) 至少,尽我所能理解。您的描述非常不清楚且难以解析...我花了几分钟才破译它,但我仍然不确定它是否正确。要么你想要的比看起来复杂得多,要么你以一种异常复杂的方式编写了它。

相关内容