删除值小于列中常量的行
remove lines where values are less than a constant in a column
cat data.txt
sr var value lat lon depth 时间单位类型
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
我想删除线
其中纬度(第 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()
).
希望对您有所帮助!
cat data.txt
sr var value lat lon depth 时间单位类型
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
我想删除线
其中纬度(第 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()
).
希望对您有所帮助!