2011-03-14 80 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

相关问题