删除值小于列中常量的行

时间:2015-01-05 18:18:28

标签: bash awk

cat data.txt

sr var value lat lon深度时间单位类型

  
      
  1. T -9999.99 31.230 25.462 0 2012102921 degC BUOY

  2.   
  3. T 20.0757 42.123 15.552 3 2012052921 degC BUOY

  4.   
  5. T -9999.99 37.523 19.122 0 20120511502143 degC BUOY

  6.   
  7. T 20.3503 37.523 25.462 3 20120530 degC BUOY

  8.   
  9. T -9999.99 09.523 25.462 0 201205300342 degC BUOY

  10.   
  11. T 20.3198 32.523 21.462 3 2012053003 degC BUOY

  12.   
  13. T -9999.99 12.523 19.333 0 2012053006 degC BUOY

  14.   
  15. T 20.387 15.523 25.462 3 20120530063421 degC BUOY

  16.   
  17. S -9999.99 37.523 15.466 0 2012053009 psu BUOY

  18.   
  19. T 20.5518 34.523 30.462 3 2014093009 degC BUOY

  20.   
  21. T -9999.99 39.523 35.462 0 2012053012 degC BUOY

  22.   
  23. T 20.7166 31.523 24.462 3 2012053012 degC BUOY

  24.   

我想删除这些行

其中lat(第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解决方案? 感谢。

1 个答案:

答案 0 :(得分:2)

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

awk '{ if ($3 >= 29.1 && $3 <= 35.9 &&
           $4 >= 22.5 && $4 <= 41.7 &&
           substr($6, 0, 8) >= "20120512" && substr($6, 0, 8) <= "20120917")
         print($0); }' < inputfile

这将打印出您示例中的一行:

T 20.7166 31.523 24.462 3 2012053012 degC BUOY

注意,我的示例行以T或S开头,而不是编号为1,2,等等。因此条件从3美元开始等。通过仅检查前8个字符来过滤日期(使用{{1 }})。

希望这有帮助!