我有一个非常大的制表符分隔的文本文件。文件中的许多行具有与文件中某列相同的值(称为列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