2014-06-18 91 views
1

我有上百萬行的文件,該文件有這個下面的模式如何獲得一百萬行的數據範圍數據集

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

記錄是否已按日期排序? – anubhava

+0

是的,他們已經排序 – QGA

+1

這些線實際上是雙倍間距嗎?順便說一句,這不是'bash',而是'sed'。而你的「企圖」是荒謬的。你甚至讀過手冊嗎? – ooga

回答

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

太糟糕了,日期沒有格式化爲明智的YYYY-mm-dd格式,所以你可以寫'$ 1>「2008-08-31」{exit }' –

+0

是的,這將是很好的。 – anubhava

+0

@anubhava非常感謝您的幫助。但是我應該說它沒有做任何事情。它通過文件,但在進程結束時它有相同數量的行。 – QGA

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完全改進。

+0

簡單但不起作用(它只會打印第一條記錄,日期爲「2008年8月31日」 – anubhava

+0

@anubhava你有沒有試試看吧?適用於我 – ooga

+0

不會有別的意見 – anubhava

2

sed一個提案:

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

雖然線條圖案,打印之間,從圖案空間和出口刪除。由於d因爲只有一個打印件而退出結束模式的第一行。以下行結束模式獲得與第二個命令打印。

+0

但是,這不僅僅是打印第二個日期的第一個記錄嗎?如果該日期有多條記錄會怎麼樣? – ooga

+0

@ooga:所有這些記錄都是爲我打印的(這就是爲什麼我使用'{N,p}')。你試過了嗎? – Qeole

+0

你抓到我了!我沒有運行它。但現在我做了,似乎只打印了第二次日期的記錄的一個額外重複。即,如果有3個或更多記錄的結束日期,它只打印前兩個。儘管如此,我正在消除我的失望,因爲沒有運行它就不小心做到了。 (編輯:顯然你不能刪除一段時間後downvote,如果你編輯它,我想我可以,也許你可以修復它。) – ooga

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 
+0

女士們,先生們,我們有一個贏家......有一些擔憂。你的腳本是唯一能夠正常工作的腳本....但是,腳本開始從01/01/2000獲取數據,而不是2002.和finisch 19/01/2007而不是2008 – QGA

+1

唉,不在我的測試中。你能展示一個*最小*的輸入樣本來證明這個問題嗎? –

+1

好的,我編輯了答案。在你的問題中,你告訴我們日期格式是'dd/mm/YYYY' - 實際上是'mm/dd/YYYY'。所以'31/08/2008'永遠不會出現在文件中! –