Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按列的值将一个文件高效地拆分为多个文件_Python_Shell_Unix - Fatal编程技术网

Python 按列的值将一个文件高效地拆分为多个文件

Python 按列的值将一个文件高效地拆分为多个文件,python,shell,unix,Python,Shell,Unix,我有一个非常大的以制表符分隔的文本文件。文件中的许多行对于文件中的一列具有相同的值(称为k列)。我想把这个文件分割成多个文件,把k值相同的条目放在同一个文件中。我该怎么做?例如: a foo 1 bar c foo 2 bar d foo 应拆分为一个文件“foo”,其中包含条目“a foo”、“c foo”和“d foo”,以及一个名为“bar”的文件,其中包含条目“1 bar”和“2 bar” 如何在shell脚本或Python中实现这一点 谢谢。我不确定它的效率有多高,但快速简便的方法是

我有一个非常大的以制表符分隔的文本文件。文件中的许多行对于文件中的一列具有相同的值(称为k列)。我想把这个文件分割成多个文件,把k值相同的条目放在同一个文件中。我该怎么做?例如:

a foo
1 bar
c foo
2 bar
d foo
应拆分为一个文件“foo”,其中包含条目“a foo”、“c foo”和“d foo”,以及一个名为“bar”的文件,其中包含条目“1 bar”和“2 bar”

如何在shell脚本或Python中实现这一点

谢谢。

我不确定它的效率有多高,但快速简便的方法是利用
awk
中文件重定向的工作方式:

awk '{ print >> $5 }' yourfile
将每一行(未修改)附加到以列
5
命名的文件中。根据需要进行调整。

我不确定它的效率有多高,但快速简便的方法是利用awk中文件重定向的工作方式:

awk '{ print >> $5 }' yourfile

将每一行(未修改)附加到以列
5
命名的文件中。根据需要进行调整。

这应符合您的规格

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

希望这有帮助

这应该符合您的规范

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

希望这有帮助

在运行了上述两个版本的awk命令(+having awk error out)并看到对python版本的请求后,我开始了一段短而不是特别艰苦的旅程,编写了一个实用程序,可以根据键轻松拆分文件

Github回购:

背景资料:

Awk错误:

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

在运行了上述两个版本的awk命令(+having awk error out)并看到了对python版本的请求之后,我开始了一段短而不是特别艰苦的旅程,编写了一个实用程序来轻松地根据键分割文件

Github回购:

背景资料:

Awk错误:

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


它可能非常有效。如果没有,请尝试mawk。如果要附加到现有文件,请仅使用
>
操作符。使用
操作符更为“糟糕”,它将在第一次写入时创建新文件或覆盖现有文件,但在同一调用过程中会在后续写入时追加(除非调用
close()
)。我的方法是这样的:
awk'{print>“/path/to/“$5.extension”}您的文件
我也可以在Python中这样做吗?我选择了
awk
,特别是为了让您重定向到自动创建并引用文件句柄的字符串。Python可以解决您的问题,但不能使用如此优雅的一行程序。我注意到,
awk
不会无差别地打开文件,即它有一个内置功能,类似于:
perl-MFileCache-ane'print{cacheout'>>,$F[4]}$\uyourfile
它可能非常高效。如果没有,请尝试mawk。如果要附加到现有文件,请仅使用
>
操作符。使用
操作符更为“糟糕”,它将在第一次写入时创建新文件或覆盖现有文件,但在同一调用过程中会在后续写入时追加(除非调用
close()
)。我的方法是这样的:
awk'{print>“/path/to/“$5.extension”}您的文件
我也可以在Python中这样做吗?我选择了
awk
,特别是为了让您重定向到自动创建并引用文件句柄的字符串。Python可以解决您的问题,但不能使用如此优雅的一行程序。我注意到,
awk
不会无差别地打开文件,即它有一个类似于的内置功能:
perl-MFileCache-ane'print{cacheout'>>,$F[4]}$\uu'yourfile
您可以省略
$0
,因为这是默认值。是的,这是一种权衡。在我看来,这使它更能自我记录,但我理解其他观点。你可以省略
$0
,因为这是默认值。是的,这是一种折衷。在我看来,这使它更能自我记录,但我理解其他观点。谢谢Garren!实际上,我在尝试使用python处理大文件(打开的文件太多)时也会遇到相同的错误。。。我正在寻找是否有办法从您的工作开始解决问题。@user971102我最近对该实用程序进行了重构,不再需要排序的输入文件。我猜你尝试了我的最新更改,它将所有打开的文件写入器都保存在内存中。有两种方法可以缓解这个问题:尝试我的旧版本(需要按键排序的输入文件才能拆分)。或者更理想的情况是,我会将实用程序(或者您也可以)更新为最近文件的LRU缓存,然后重新打开现有文件(作为附加),替换缓存中最旧的文件编写器。使用排序数据的旧版本很有魅力:)非常感谢@user971102很高兴听到这个消息!我更新了按密钥分割文件以处理几乎无限的文件。谢谢Garren!实际上,我在尝试使用python处理大文件(打开的文件太多)时也会遇到相同的错误。。。我正在寻找是否有办法从您的工作开始解决问题。@user971102我最近对该实用程序进行了重构,不再需要排序的输入文件。我猜你尝试了我的最新更改,它将所有打开的文件写入器都保存在内存中。有两种方法可以缓解这个问题:尝试我的旧版本(需要按键排序的输入文件才能拆分)。或者更理想的情况是,我会将实用程序(或者您也可以)更新为最近文件的LRU缓存,然后重新打开现有文件(作为附加),替换缓存中最旧的文件编写器。使用排序数据的旧版本很有魅力:)非常感谢@user971102很高兴听到这个消息!我更新了按密钥分割文件以处理几乎无限的文件。