我有一个包含数百万行的文件,其格式如下
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$
答案 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。