我们有一个tyfoons.txt文件,其中包含过去实际台风的几个信息属性。文件中的一行如下:
Name-identification number- wind - duration - beginning date - ending date
----------------------------------------------------------------------------------
Mary ( North ) − 1977.21 − 945 − 12 Days 18 Hours − 1977−12−21 00:00 − 1978−01−02 18:00现在我要过滤掉两个不同年份的台风,就像上面提到的1977年和1978年的台风。我们认为台风的存在时间不会超过30天。
我如何从文件中过滤出这些行?
发布于 2015-01-02 17:54:58
使用:g命令可以实现一个简单的解决方案(只检查是否跨越了一年)。
例如,删除开始和结束时没有相同年份的任何行
:g!/\(\d\{4}\)−\d\d−\d\d \d\d:\d\d − \1−\d\d−\d\d \d\d:\d\d$/d这里的相关部分是将第一个日期中匹配的年份(\(\d\{4\}\))重复使用为第二个数据(\1)中的年份。:g!/{pat}/{cmd}对不匹配{pat}的每一行执行{cmd},因此当年份不同时,运行:d命令并删除该行。
执行更复杂的检查(在30天内)可能更好的方法是编写一个函数,将相关数据从行中分离出来,并进行必要的计算。一个基本的骨架是:
function DeleteInvalidDateRanges()
" matchlist() returns a list of the entire string that matched and all matched groups
" so slicing the list to extract items 1-4 gives a list of [year, month, date, time]
let dateTime1 = matchlist(getline('.'), '\(\d\{4}\)−\(\d\d\)−\(\d\d\) \(\d\d:\d\d\)', 0, 1)[1:4]
let dateTime2 = matchlist(getline('.'), '\(\d\{4}\)−\(\d\d\)−\(\d\d\) \(\d\d:\d\d\)', 0, 2)[1:4]
if MoreThan30Days(dateTime1, dateTime2)
delete
endif
endfunction
:%call DeleteInvalidDateRanges()有关Vim中脚本的更多信息,您可以看到用户指南的用户指南。
简单地删除开始月份为12和结束月份为01的任何行,都是对最初的“不同年份”示例的轻微更改。
:g/\d\{4}−12−\d\d \d\d:\d\d − \d\{4}−01−\d\d \d\d:\d\d$/dhttps://stackoverflow.com/questions/27745757
复制相似问题