Python 使用Unix开始按行拆分文件
我需要使用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
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
,脚本将始终工作,但如果没有它,脚本可能会失败。所以我把它放进去了,这只是一个一般性的评论。我完全同意你的看法。