Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 使用Unix开始按行拆分文件_Python_Python 3.x_File_Unix_Awk - Fatal编程技术网

Python 使用Unix开始按行拆分文件

Python 使用Unix开始按行拆分文件,python,python-3.x,file,unix,awk,Python,Python 3.x,File,Unix,Awk,我需要使用Unix按文件的第一个标记拆分文件 原始文件的外观如下所示: TAG ANIMAL A CAT B CAT C CAT D DOG A DOG 结果文件应如下所示(拆分后): 文件1 TAG ANIMAL A CAT A DOG 文件2 TAG ANIMAL B CAT TAG ANIMAL C CAT TAG ANIMAL D DOG 文件3 TAG ANIMAL B CAT TAG ANIMAL C CAT TA

我需要使用Unix按文件的第一个标记拆分文件

原始文件的外观如下所示:

TAG ANIMAL
A CAT
B CAT  
C CAT
D DOG
A DOG
结果文件应如下所示(拆分后):

文件1

TAG ANIMAL  
A CAT  
A DOG  
文件2

TAG ANIMAL  
B CAT  
TAG ANIMAL  
C CAT  
TAG ANIMAL  
D DOG  
文件3

TAG ANIMAL  
B CAT  
TAG ANIMAL  
C CAT  
TAG ANIMAL  
D DOG  
文件4

TAG ANIMAL  
B CAT  
TAG ANIMAL  
C CAT  
TAG ANIMAL  
D DOG  
尝试: 我尝试使用文件名前缀split-p,但这只适用于已排序的数据,因此猫和狗最终会出现在不同的文件中。我还从中得到了另外3个不需要的随机文件

试试这个

 split [options] filename prefix

  it will split your file in unix

这款awk one liner将帮助您:

awk 'NR==1{t=$0;next}!a[$1]{print t>$1}{print >>$1;a[$1]=1;close($1)}' file
如果我们使用您的示例进行测试,在执行awk cmd之后,您将得到
A、B、C、D
四个文件

kent$  cat f
TAG ANIMAL
A CAT
B CAT  
C CAT
D DOG
A DOG

kent$  awk 'NR==1{t=$0;next}!a[$1]{print t>$1}{print >>$1;a[$1]=1;close($1)}' f

kent$  head {A..D}
==> A <==
TAG ANIMAL
A CAT
A DOG

==> B <==
TAG ANIMAL
B CAT  

==> C <==
TAG ANIMAL
C CAT

==> D <==
TAG ANIMAL
D DOG
kent$f类
标记动物
猫
B猫
C猫
D狗
狗
肯特$awk'NR==1{t=$0;下一个}!a[$1]{print t>$1}{print>>$1;a[$1]=1;close($1)}'f
肯特$头{A..D}

==>A B C D您可以在Python中创建一个
split_file.py
scrip,如下所示:

original_file = open('original_file.txt', 'r')
file_contents = []
for line in original_file:
    file_contents.append(line.split())

tags = {c[0] for c in file_contents[1:]}
for tag in tags:
    file_name = 'file_{}.txt'.format(tag)
    new_file = open(file_name, 'w')
    new_file.write('{} {}\n'.format(file_contents[0][0], file_contents[0][1]))
    for content in file_contents:
        if content[0] == tag:
            new_file.write('{} {}\n'.format(content[0], content[1]))

    new_file.close()
此脚本假定您的原始文件名为
original\u file.txt
,它将创建名为
file\u.txt
的新文件

你可以打电话

python split_file.py


执行它。

当我运行此操作时,我得到一个错误,即split[options]没有这样的文件或目录。这不符合OP的要求。如果没有太多的标记,
close
的使用可能会过度。@kvantour我们不知道OP的输入是什么样子的。即使是Op本人也可能无法确定输入是如何进行的。使用
close
,脚本将始终工作,但如果没有它,脚本可能会失败。所以我把它放进去了,这只是一个一般性的评论。我完全同意你的看法。