如何获取百万行数据集中的数据范围

时间:2014-06-18 17:41:09

标签: bash text awk sed grep

我有一个包含数百万行的文件,其格式如下

01/02/1991,0931,7.13,7.13,7.13,7.13,8000

01/02/1991,0932,7.14,7.14,7.14,7.14,8000

01/02/1991,0935,7.16,7.16,7.16,7.16,3200

01/02/1991,0938,7.16,7.17,7.16,7.17,19200

01/02/1991,0941,7.19,7.19,7.19,7.19,200000 

01/02/1991,0956,7.19,7.19,7.19,7.19,8800

日期格式为mm/dd/YYYY。如何才能获得01/01/2002和08/31/2008之间的数据范围并删除其他行?日期01/01/2002和08/31/2008本身可能不在文件中。

我想在bash中做到这一点

头文件:

01/02/1991,0931,7.13,7.13,7.13,7.13,83200^M$
01/02/1991,0932,7.14,7.14,7.14,7.14,8000^M$
01/02/1991,0935,7.16,7.16,7.16,7.16,3200^M$
01/02/1991,0938,7.16,7.17,7.16,7.17,19200^M$
01/02/1991,0941,7.19,7.19,7.19,7.19,200000^M$
01/02/1991,0956,7.19,7.19,7.19,7.19,8800^M$
01/02/1991,0957,7.20,7.20,7.20,7.20,13600^M$
01/02/1991,0958,7.22,7.22,7.22,7.22,5600^M$
01/02/1991,1003,7.22,7.23,7.22,7.23,8000^M$
01/02/1991,1006,7.23,7.23,7.23,7.23,10400^M$

4 个答案:

答案 0 :(得分:3)

使用awk即可:

awk -F, '$1=="01/02/2002"{p=1} $1=="01/08/2008"{p=2} $1!="01/08/2008" && p==2{exit} p' dataset.txt

答案 1 :(得分:2)

sed提案:

sed -n '\#01/01/2002#,\#31/08/2008#{p;d}; \#31/08/2008#p' \
   dataset.txt > newFile.txt

虽然线条在图案之间,但是从图案空间打印,删除并退出。由于d,第一行结束模式退出,所以只有一个打印。下面的结束模式行用第二个命令打印。

答案 2 :(得分:2)

这是另一种选择:将日期作为时间进行比较。这将比anubhava的解决方案慢得多。需要GNU awk:

gawk -F, -v start_date=01/01/2002 -v end_date=08/31/2008 '
    function to_epoch(date) {
        #             ... year .....     ... month ......     ... day ........
        return mktime(substr(date,7) " " substr(date,1,2) " " substr(date,4,2) " 0 0 0")
    }
    BEGIN { start = to_epoch(start_date); end = to_epoch(end_date) }
    { t = to_epoch($1) }
    start <= t && t <= end
    t > end {exit}
' file

答案 3 :(得分:1)

awk -F, '$1=="01/01/2002",$1=="31/08/2008" {print;next} $1=="31/08/2008" {print;next} {quit}' file

添加了额外的$1=="31/08/2008"以打印该日期的所有记录(而不仅仅是第一个)。并增加了退出效率。改善完全归因于anubhava。