从textfile中分割列并添加与列中相同数量的数字

2024-10-04 05:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的文本文件(2GB),有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解决这个问题吗?你知道吗


Tags: 文件go数字制表符perl文本文件q6gzx4q6gzx1
3条回答

作为Unix风格的过滤器编写,没有任何解释(因为在这里要求解决方案之前,您似乎没有做出任何努力来解决问题)。你知道吗

#!/usr/bin/perl

use strict;
use warnings;

while (<>) {
  my @cols = split /\t/;
  foreach my $data (split /;\s+/, $cols[1]) {
    print "$cols[0]\t$data\t$cols[2]";
  }
}

只需先按制表符拆分行,然后拆分第二列并使用循环。你知道吗

代码

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";
        }

}

希望这对你有用。你知道吗

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

#!/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

相关问题 更多 >