2011-03-14 84 views
1

我有一個非常大的製表符分隔的文本文件。文件中的許多行具有與文件中某列相同的值(稱爲列k)。我想將這個文件分成多個文件,在同一個文件中輸入相同的k值。我怎樣才能做到這一點?例如:通過列的值有效地將一個文件分割成多個文件

a foo 
1 bar 
c foo 
2 bar 
d foo 

應分成一個文件「foo」的包含條目「一個Foo」和「c foo」和「d foo」的和稱爲「欄」包含條目「1名欄」文件和「2條」。

我該如何在shell腳本或Python中執行此操作?

謝謝。

+0

多大的文件? – 2011-03-14 22:07:44

+0

400萬行 – user248237dfsf 2011-03-14 22:09:27

回答

8

我不知道它是如何高效是,但快速簡便的方法是採取的方式文件重定向的優勢工作在awk

awk '{ print >> $5 }' yourfile 

這將追加每行(未修改)到名爲5列的文件中。必要時進行調整。

+0

這可能是非常有效的。如果沒有,試試mawk。 – ninjalj 2011-03-14 22:26:10

+0

如果您追加到現有文件上,只能使用'>>'運算符。使用'>'運算符會更加「AWKish」,它將在第一次寫入時創建一個新文件或覆蓋現有文件,但在同一次調用期間(除非調用close()')纔會在後續寫入中追加。這是我的方式:'awk'{print>「/ path/to /」$ 5「.extension」}'yourfile' – 2011-03-14 22:56:21

+0

我怎樣才能在Python中做到這一點? – user248237dfsf 2011-03-15 17:06:13

7

這應該按您的規格工作

awk '{outFile=$2; print $0 > outFile}' BigManegyFile 

希望這有助於。

+0

您可以省略$ 0,因爲這是默認值。 – 2011-03-14 22:54:32

+1

是的,這是一個折衷。在我看來,它使它更加自我記錄,但我理解其他觀點。 – shellter 2011-03-14 23:16:20

1

運行上述awk命令的兩個版本(+有awk錯誤)並且看到python版本的請求後,我開始了一個簡短而不是特別艱難的編寫實用程序的旅程,以便根據密鑰輕鬆分割文件。

Github上回購:https://github.com/gstaubli/split_file_by_key

背景信息:http://garrens.com/blog/2015/04/02/split-file-by-keys/

awk中的錯誤:

awk: 14 makes too many open files 
input record number 4555369, file part-r-00000 
source line number 1 
+0

謝謝Garren!我嘗試使用python與一個大文件(太多打開的文件)時,我實際上得到相同的錯誤...我正在尋找是否有任何方法來解決你的工作。 – user971102 2017-05-06 07:59:23

+0

@ user971102我最近重構該實用程序以不再需要排序的輸入文件。我認爲你嘗試了我最新的改變,它將所有打開的文件編寫器保存在內存中。減輕這個問題的兩種方法:嘗試我的舊版本(這將需要按鍵分類的輸入文件)。或者更理想的情況是,我將更新實用程序(或者您可以)爲最新文件的LRU緩存之類的東西,然後重新打開現有文件(如追加),替換緩存中最老的文件寫入器。 – Garren 2017-05-06 15:59:14

+0

帶有排序數據的舊版本就像一個魅力:)非常感謝! – user971102 2017-05-06 23:14:03

相關問題