2013-07-03 104 views
5

我有幾個大型數據文件(〜100MB-1GB的文本)和一個數萬個時間戳的索引數據點的排序列表。時間戳文件看起來像:逐步掃描大文件

12345 
15467 
67256 
182387 
199364 
... 

,而數據文件的樣子:

Line of text 
12345 0.234 0.123 2.321 
More text 
Some unimportant data 
14509 0.987 0.543 3.600 
More text 
15467 0.678 0.345 4.431 

在第二個文件中的數據是所有時間戳順序。我想通過使用第一個時間戳的第二個文件,在輸出文件中打印時間戳和第四個數據項。我一直在使用這個:

grep -wf time.stamps data.file | awk '{print $1 "\t" $4 }' >> output.file 

這是對每個數據文件採取一天的完成順序。問題是這個命令在time.stamps中搜索每一行的整個數據文件,但我只需要搜索從最後一個數據點中選取。有什麼辦法可以加快這個過程嗎?

回答

4

你可以這樣做完全是在awk ...

awk 'NR==FNR{a[$1]++;next}($1 in a){print $1,$4}' timestampfile datafile 
+1

+1:花了我一點時間瞭解它是如何工作的,但是一旦我明白腳本的第一部分將所有時間戳加載到數組「a」中,第二部分檢查是否存在數據文件中第一個字段的數組,我可以看到這是一個非常優雅的解決方案,只需要足夠的內存來存儲所有時間戳。 – Simon

+1

@Simon你是一位快速學習者,我的朋友。它確實如此。爲了進一步提高性能,可以在匹配後刪除數組元素。這會減小下一次掃描的大小,但如果該元素再次出現在文件中,它將不匹配。 –

+0

不錯!現在需要8小時的工作需要12秒。 – user2548142

1

JS웃的awk解決方案可能是要走的路。如果join可用並且不相關的「數據」的第一個字段不是數字,則可以利用這些文件的順序相同並避免排序步驟的事實。此示例在Linux

join -o2.1,2.4 -1 1 -2 1 key.txt <(awk '$1 ~ /^[[:digit:]]+$/' data.txt) 
0

「的grep」具有很少使用的選項-f filename從文件名獲得的模式和不匹配使用bash進程替換。它可能會擊敗awk解決方案,您的時間戳不必排序。