删除值小于列中常量的行

remove lines where values are less than a constant in a column

cat data.txt

sr var value lat lon depth 时间单位类型

  1. T -9999.99 31.230 25.462 0 2012102921 degC BUOY

  2. T 20.0757 42.123 15.552 3 2012052921 degC BUOY

  3. T -9999.99 37.523 19.122 0 20120511502143 degC BUOY

  4. T 20.3503 37.523 25.462 3 20120530 degC BUOY

  5. T -9999.99 09.523 25.462 0 201205300342 degC BUOY

  6. T 20.3198 32.523 21.462 3 2012053003 degC BUOY

  7. T -9999.99 12.523 19.333 0 2012053006 degC BUOY

  8. T 20.387 15.523 25.462 3 20120530063421 degC BUOY

  9. S -9999.99 37.523 15.466 0 2012053009 psu BUOY

  10. T 20.5518 34.523 30.462 3 2014093009 degC BUOY

  11. T -9999.99 39.523 35.462 0 2012053012 degC BUOY

  12. T 20.7166 31.523 24.462 3 2012053012 degC BUOY

我想删除线

其中纬度(第 4 列)小于 minLat=29.1 且大于 maxLat=35.9

其中 lon(第 5 列)小于 minLon=22.5 且大于 maxLon=41.7

其中时间(第 7 列)小于 minTime=20120512 且大于 maxTime=20120917

在第 7 列中,时间为 YYYYMMDDHHMMSS 格式。但有时是 20120512(没有小时、分钟和秒),有时是 20120718305232(有分钟和秒)。 ${minTime}${maxTime} 总是固定长度 (YYYYMMDD)。或者将第 7 列中的 20120512 更改为 20120512000000 以轻松过滤。

任何 awk 解决方案? 谢谢。

是的,awk 必须能够做到这一点。尝试类似的东西:

awk '{ if ( >= 29.1 &&  <= 35.9 &&
            >= 22.5 &&  <= 41.7 &&
           substr(, 0, 8) >= "20120512" && substr(, 0, 8) <= "20120917")
         print([=10=]); }' < inputfile

这只会打印您示例中的一行:

T 20.7166 31.523 24.462 3 2012053012 degC BUOY

请注意,我让您的示例行以 T 或 S 开头,而不是您的编号 1、2 等。因此条件从 3 美元等开始。通过仅检查前 8 个字符(使用 substr()).

希望对您有所帮助!