【问题标题】:Splitting file by line start using Unix使用 Unix 开始逐行拆分文件
【发布时间】:2019-04-21 05:45:20
【问题描述】:

我需要使用 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 A 文件名前缀,但这仅适用于已排序的数据,因此 A CAT & A DOG 最终位于不同的文件中。我还从中获得了 3 个其他随机文件,这些文件是不需要的。

【问题讨论】:

    标签: python python-3.x file unix awk


    【解决方案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
    

    【讨论】:

    • 如果标签不多,close 的使用可能会过大。
    • @kvantour 我们不知道 OP 的输入是什么样子的。甚至 Op 本人也可能无法确定输入的内容。使用close,脚本将始终有效,但没有它,脚本可能会失败。所以我把它放在那里。
    • 这只是一般性的评论。我完全同意你的看法。
    【解决方案2】:

    试试这个。

     split [options] filename prefix
    
      it will split your file in unix
    

    【讨论】:

    • 当我运行这个时,我得到一个错误,split [options] is no such file or directory。
    • 这不符合 OP 的要求
    【解决方案3】:

    您可以在 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_&lt;tag name&gt;.txt 的新文件。

    你可以打电话

    python split_file.py

    执行它。

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 2018-06-03
      • 2012-05-24
      • 2015-12-03
      • 2021-02-06
      • 1970-01-01
      • 2023-02-10
      • 2018-10-24
      • 1970-01-01
      相关资源
      最近更新 更多