从文本文件中划分列,并添加描述与列中的数字一样多

时间:2016-06-22 09:06:19

标签: python perl csv

我有一个巨大的文本文件(2 GB),有3列(以制表符分隔)。我想划分2.列,以便每个数字都有一个单独的行。

我的callange是添加第1列和第3列的描述。

文件的头部看起来像:

Q6GZX4  81941549; 47060116; 49237298    GO:0006355; GO:0046782; GO:0006351
Q6GZX1  81941546; 49237301              GO:0033644; GO:0016021
Q6GZW6  49237306                        GO:0005524; GO:0003677; GO:0004386
Q6GZW5  81941542; 49237307              GO:0033644; GO:0016021

输出应为:

Q6GZX4  81941549    GO:0006355; GO:0046782; GO:0006351
Q6GZX4  47060116    GO:0006355; GO:0046782; GO:0006351
Q6GZX4  49237298    GO:0006355; GO:0046782; GO:0006351
Q6GZX1  81941546    GO:0033644; GO:0016021
Q6GZX1  49237301    GO:0033644; GO:0016021
Q6GZW6  49237306    GO:0005524; GO:0003677; GO:0004386
Q6GZW5  81941542    GO:0033644; GO:0016021
Q6GZW5  49237307    GO:0033644; GO:0016021

让每个人都知道如何用perl或python解决这个问题?

4 个答案:

答案 0 :(得分:2)

这可能是一个解决方案,但你真的应该尝试过......

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw{say};

{
    while (<DATA>) {
        my ($column1, $group1, $group2) = $_ =~ /^(\w+)\s+([\d;\s]+)(GO.*)$/;

        $group1 =~ s/\s//g; # Strip spaces / tabs
        my @list = split /;/, $group1;

        foreach my $element (@list) {
            say "$column1\t$element\t$group2";
        }
    }

}

__DATA__
Q6GZX4  81941549; 47060116; 49237298    GO:0006355; GO:0046782; GO:0006351
Q6GZX1  81941546; 49237301              GO:0033644; GO:0016021
Q6GZW6  49237306                        GO:0005524; GO:0003677; GO:0004386
Q6GZW5  81941542; 49237307              GO:0033644; GO:0016021

答案 1 :(得分:0)

首先按标签拆分行,然后拆分第二列并使用循环。

代码

my $filename ="abc.txt"; # provide your text filename
open FH, $filename or die "Error\n";
while(<FH>)
{
        chomp($_);
        my @arr = split(/\t/,$_);
        my @val =split(/;\s/,$arr[1]); # check the delimiter here if you have any problem
        foreach my $id (@val)
        {
                print "$arr[0]\t$id\t$arr[2]\n";
        }

}

希望这对你有用。

答案 2 :(得分:0)

作为Unix风格的过滤器编写,没有任何解释(因为在此处寻求解决方案之前,您似乎没有做出任何努力来解决问题)。

const

答案 3 :(得分:0)

很高兴看到一些perl代码!

这是我的python3解决方案,没有尝试过这么大的文件,但对问题感到好奇......

#!/usr/bin/python                                                                                                                                              

def next_line_formated(entry):
    key, ids, *_, values = entry.split('\t')
    for n in ids.split('; '):
        yield "{}  {}\t{}".format(key, n, values)

with open('IN', 'rt') as input_file:
    with open('OUT', 'w') as output_file:
        for entry in input_file:
            for line in next_line_formated(entry):
                output_file.write(line)