我有一個非常大的製表符分隔的文本文件。文件中的許多行具有與文件中某列相同的值(稱爲列k)。我想將這個文件分成多個文件,在同一個文件中輸入相同的k值。我怎樣才能做到這一點?例如:通過列的值有效地將一個文件分割成多個文件
a foo
1 bar
c foo
2 bar
d foo
應分成一個文件「foo」的包含條目「一個Foo」和「c foo」和「d foo」的和稱爲「欄」包含條目「1名欄」文件和「2條」。
我該如何在shell腳本或Python中執行此操作?
謝謝。
我有一個非常大的製表符分隔的文本文件。文件中的許多行具有與文件中某列相同的值(稱爲列k)。我想將這個文件分成多個文件,在同一個文件中輸入相同的k值。我怎樣才能做到這一點?例如:通過列的值有效地將一個文件分割成多個文件
a foo
1 bar
c foo
2 bar
d foo
應分成一個文件「foo」的包含條目「一個Foo」和「c foo」和「d foo」的和稱爲「欄」包含條目「1名欄」文件和「2條」。
我該如何在shell腳本或Python中執行此操作?
謝謝。
我不知道它是如何高效是,但快速簡便的方法是採取的方式文件重定向的優勢工作在awk
:
awk '{ print >> $5 }' yourfile
這將追加每行(未修改)到名爲5
列的文件中。必要時進行調整。
這可能是非常有效的。如果沒有,試試mawk。 – ninjalj 2011-03-14 22:26:10
如果您追加到現有文件上,只能使用'>>'運算符。使用'>'運算符會更加「AWKish」,它將在第一次寫入時創建一個新文件或覆蓋現有文件,但在同一次調用期間(除非調用close()')纔會在後續寫入中追加。這是我的方式:'awk'{print>「/ path/to /」$ 5「.extension」}'yourfile' – 2011-03-14 22:56:21
我怎樣才能在Python中做到這一點? – user248237dfsf 2011-03-15 17:06:13
這應該按您的規格工作
awk '{outFile=$2; print $0 > outFile}' BigManegyFile
希望這有助於。
您可以省略$ 0,因爲這是默認值。 – 2011-03-14 22:54:32
是的,這是一個折衷。在我看來,它使它更加自我記錄,但我理解其他觀點。 – shellter 2011-03-14 23:16:20
運行上述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
謝謝Garren!我嘗試使用python與一個大文件(太多打開的文件)時,我實際上得到相同的錯誤...我正在尋找是否有任何方法來解決你的工作。 – user971102 2017-05-06 07:59:23
@ user971102我最近重構該實用程序以不再需要排序的輸入文件。我認爲你嘗試了我最新的改變,它將所有打開的文件編寫器保存在內存中。減輕這個問題的兩種方法:嘗試我的舊版本(這將需要按鍵分類的輸入文件)。或者更理想的情況是,我將更新實用程序(或者您可以)爲最新文件的LRU緩存之類的東西,然後重新打開現有文件(如追加),替換緩存中最老的文件寫入器。 – Garren 2017-05-06 15:59:14
帶有排序數據的舊版本就像一個魅力:)非常感謝! – user971102 2017-05-06 23:14:03
多大的文件? – 2011-03-14 22:07:44
400萬行 – user248237dfsf 2011-03-14 22:09:27