我有一个巨大的文本文件(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解决这个问题?
答案 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)