cat data.txt
sr var value lat lon深度时间单位类型
T -9999.99 31.230 25.462 0 2012102921 degC BUOY
T 20.0757 42.123 15.552 3 2012052921 degC BUOY
T -9999.99 37.523 19.122 0 20120511502143 degC BUOY
T 20.3503 37.523 25.462 3 20120530 degC BUOY
T -9999.99 09.523 25.462 0 201205300342 degC BUOY
T 20.3198 32.523 21.462 3 2012053003 degC BUOY
T -9999.99 12.523 19.333 0 2012053006 degC BUOY
T 20.387 15.523 25.462 3 20120530063421 degC BUOY
S -9999.99 37.523 15.466 0 2012053009 psu BUOY
T 20.5518 34.523 30.462 3 2014093009 degC BUOY
T -9999.99 39.523 35.462 0 2012053012 degC BUOY
- 醇>
T 20.7166 31.523 24.462 3 2012053012 degC BUOY
我想删除这些行
其中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解决方案? 感谢。
答案 0 :(得分:2)
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 }})。
希望这有帮助!