2013-07-04 31 views
2

我有一個巨大的文件,每行以時間戳開始,如下所示。我需要一種方法來在兩個日期之間刷新行。有沒有簡單的方法使用sed或awk來完成,而不是在每一行中提取日期字段並比較日/月/年?外殼腳本從兩個日期範圍之間的文件中提取數據

例如,需要通過檢查時間戳在第一場

文件內容,以2013年6月1日之間進行數據解壓到2013年6月15日:

2013-06-02T19:44:59;(3305,3308,2338,102116);aaaa;xxxx 
2013-06-14T20:01:58;(2338);aaaa;xxxx 
2013-06-12T20:01:58;(3305,3308,2338);bbbb;xxxx 
2013-06-13T20:01:59;(3305,3308,2338,102116);bbbb;xxxx 
2013-06-13T20:02:53;(2338);bbbb;xxxx 
2013-06-13T20:02:53;(3305,3308,2338);aaaa2;xxxx 
2013-06-13T20:02:54;(3305,3308,2338,102116);aaaa2;xxxx 
2013-06-14T20:31:58;(2338);aaaa2;xxxx 
2013-06-14T20:31:58;(3305,3308,2338);aaaa;xxxx 
2013-06-15T20:31:59;(3305,3308,2338,102116);bbbb;xxxx 
2013-06-16T20:32:53;(2338);aaaa;xxxx 
2013-06-16T20:32:53;(3305,3308,2338);aaaa2;xxxx 
2013-06-16T20:32:54;(3305,3308,2338,102116);bbbb;xxxx 
+1

您試過了什麼?你有沒有嘗試過什麼? – devnull

回答

2

它可能不是你的第一選擇,但Perl是偉大的這項任務。

perl -ne "print if (m/2013-06-02/ .. m/2013-06-15/)" myfile.txt 

此工作的方式是,如果該第一觸發匹配(即m/2013-06-02/),則條件(print)將在每一行,直至第二觸發匹配執行(即m/2013-06-15)。

但是,如果您指定m/2013-06-01/作爲觸發器,則此技巧將不起作用,因爲它在您的文件中從未匹配。

一個不太令人興奮的技術是提取各行一些文本和測試:

perl -ne 'if (m/^([0-9-]+)/) { $date = $1; print if ($date ge "2013-06-01" and $date le "2013-06-15") }' myfile.txt 

(測試兩個表達式和工作)。

+0

這隻有在日期按照排序順序時纔有效。 – Vijay

+0

@Vijay第一種技術只有在日期按排序順序時纔有效。第二種技術將與未分類的數據一起使用。 –

+1

非常感謝!第二種技術適用於我的要求。 – Amogh

2

你可以嘗試這樣的:

awk -F'-|T' '$1==2013 && $2==06 && $3>=01 && $3<=15' hugefile 
+0

感謝您的回答,但這不會滿足我的完整需求,因爲我將不得不進一步修改它以提取不同年/月之間的數據。 – Amogh

+0

@Amogh對不起,我無法理解您的完整需求 - 需要通過檢查第一個字段中的時間戳,提取2013年6月1日到2013年6月15日之間的數據_ –

1

您可以使用sed打印兩種模式之間的所有行。在這種情況下,您首先必須sort文件,因爲日期是交錯的:

$ sort file | sed -n '/2013-06-12/,/2013-06-15/p' 
2013-06-12T20:01:58;(3305,3308,2338);bbbb;xxxx 
2013-06-13T20:01:59;(3305,3308,2338,102116);bbbb;xxxx 
2013-06-13T20:02:53;(2338);bbbb;xxxx 
2013-06-13T20:02:53;(3305,3308,2338);aaaa2;xxxx 
2013-06-13T20:02:54;(3305,3308,2338,102116);aaaa2;xxxx 
2013-06-14T20:01:58;(2338);aaaa;xxxx 
2013-06-14T20:31:58;(2338);aaaa2;xxxx 
2013-06-14T20:31:58;(3305,3308,2338);aaaa;xxxx 
2013-06-15T20:31:59;(3305,3308,2338,102116);bbbb;xxxx 
+0

謝謝,但是如果文件中不存在輸入日期模式,則這可能不起作用。 – Amogh

+0

我認爲在遇到其他人遇到此問題並對數據進行排序的情況下獲得此答案非常有用。謝謝! –

相關問題