删除描述行并将时间添加到第一列

remove description lines and add time to the first column

AWk 高手,我有一个如下描述的文件,我想知道是否可以轻松地将它转换成我想要的格式:

该文件包含超过一个月的多个变量(仅在一天内遵守一次,但有些日子可能会丢失)。除了 date/value 之外,每一天的格式都是相同的。但是每天的结尾都有一些描述行(包含文字和数字),不同天描述行的数量不同。

    KBO BTA Observations at 12Z 01 Feb 2020
-----------------------------------------------------------------------------
   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV
    hPa     m      C      C      %    g/kg    deg   knot     K      K      K
-----------------------------------------------------------------------------
 1000.0     92
  925.0    765
  850.0   1516
  754.0   2546   13.0    9.3     78   9.85    150      2  310.2  340.6  312.0
  752.0   2569   14.0    9.2     73   9.80    149      2  311.5  342.0  313.4
  700.0   3173  -9.20    7.5     89   9.38    120      6  312.6  341.9  314.4
Station information and sounding indices
                          Station elevation: 2546.0
                               Lifted index: 1.83
Pres [hPa] of the Lifted Condensation Level: 693.42
              1000 hPa to 500 hPa thickness: 5798.00
Precipitable water [mm] for entire sounding: 21.64
8022 KBO BTA Observations at 00Z 02 Feb 2020
-----------------------------------------------------------------------------
   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV
    hPa     m      C      C      %    g/kg    deg   knot     K      K      K
-----------------------------------------------------------------------------
 1000.0     97
  925.0    758
  850.0   1515
  753.0   2546   10.8    6.8     76   8.30    190      3  307.9  333.4  309.5
  750.0   2580   12.6    7.9     73   8.99    186      3  310.2  338.1  311.9

这是我想要的:删除所有描述行并阅读 date/time 信息并将其作为第一列。

Time  PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV
20200201t12Z  754.0   2546   13.0    9.3     78   9.85    150      2  310.2  340.6  312.0
20200201t12Z  752.0   2569   14.0    9.2     73   9.80    149      2  311.5  342.0  313.4
20200201t12Z  700.0   3173   -9.2    7.5     89   9.38    120      6  312.6  341.9  314.4
20200202t00Z  753.0   2546   10.8    6.8     76   8.30    190      3  307.9  333.4  309.5
20200202t00Z  750.0   2580   12.6    7.9     73   8.99    186      3  310.2  338.1  311.9

感谢任何帮助。

凯莉

像这样...

$ awk 'function m(x) 
         {return sprintf("%02d",int(index("JanFebMarAprMayJunJulAugSepOctNovDec",x)-1)/3+1)} 

 NR==1   {print "time PRES TEMP WDIR WSPD RELH"} 
 /^-+$/  {f=!f} 
 f       {date=p[n] m(p[n-1]) p[n-2]} 
!f       {n=split([=10=],p)}  
 NF==11 && !/[^ 0-9.-]/ {print date,[=10=]}' file | column -t

time      PRES  TEMP  WDIR  WSPD  RELH
20200201  1000  10    230   5     90
20200201  900   9     200   6     85
20200201  800   9     100   6     87
20200202  1000  9.2   233   5     90
20200202  900   9.1   200   4     80
20200202  800   9     176   2     80

说明 通过查找索引并转换为格式化数字

,函数只是returns来自月份字符串的月份数字

f 跟踪虚线,以便从上一行我们可以解析日期,

最终找到数据行启发式是字段数并且没有非数字符号(数字、空格、点或负号)。

$ cat tst.awk
/^-+$/ && ( ((++dashCnt) % 2) == 1 ) {
    mthNr = (index("JanFebMarAprMayJunJulAugSepOctNovDec",p[n-1])+2)/3
    time = sprintf("%04d%02d%02d", p[n], mthNr, p[n-2])
}
/^[[:upper:][:space:]]+$/ && !doneHdr++ { print "Time", [=10=] }
/^[0-9.[:space:]]+$/ { print time, [=10=] }
{ n = split([=10=],p) }

.

$ awk -f tst.awk file | column -t
Time      PRES  TEMP  WDIR  WSPD  RELH
20200001  1000  10    230   5     90
20200001  900   9     200   6     85
20200001  800   9     100   6     87
20200002  1000  9.2   233   5     90
20200002  900   9.1   200   4     80
20200002  800   9     176   2     80