使用Unix开始按行分割文件

时间:2018-11-18 20:04:42

标签: 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  

文件3

TAG ANIMAL  
C CAT  

文件4

TAG ANIMAL  
D DOG  

尝试: 我尝试了split -p一个文件名前缀,但这仅适用于排序的数据,因此CAT和DOG最终位于不同的文件中。我还从中得到了3个其他随机文件,它们是不需要的。

3 个答案:

答案 0 :(得分:1)

这种awk单线可为您提供帮助:

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

答案 1 :(得分:0)

尝试一下。

 split [options] filename prefix

  it will split your file in unix

答案 2 :(得分:0)

您可以在Python中通过创建如下的split_file.py脚本来完成此操作:

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_file.txt,它将创建名为file_<tag name>.txt的新文件。

您可以致电

  

python split_file.py

执行它。