我有大的制表符分隔的文件,如下面的例子:如何优化独特行的搜索?
scaffold1443 182629 182998 chr1.1.1.241051.241420 367 99.80
scaffold1443 131948 132412 chr1.1.2.291778.292242 462 99.80
scaffold1443 96142 96474 chr1.1.3.327471.327803 330 99.70
scaffold1443 53153 53479 chr1.1.4.370342.370668 322 99.40
scaffold526 2870014 2870523 chr1.1.5.488372.488881 507 99.90
scaffold526 2865956 2866314 chr1.1.6.490869.491234 357 98.10
scaffold526 2867666 2868024 chr1.1.6.490869.491234 357 98.10
scaffold526 2485557 2485867 chr1.1.7.610677.610987 310 100.00
我想在一个新的文件只有行的第4列是唯一的打印。 在前面的示例中,除了第4列中包含“chr1.1.6.490869.491234”的两行外,应打印所有行。
我编写的以下脚本(它是较大管道的一部分)完成这项工作,但速度非常慢,尤其是当输入文件非常大时。
#!/usr/bin/perl
use strict;
use warnings;
#This script takes the best hits output and finds the unique elements that up to only one scaffold.
my $target = $ARGV[0];
my $chromosome = $ARGV[1];
my @mykeys = `cat OUTPUT_$target/psl_score_byname_$target/$chromosome.table| awk '{print \$4}'| sort -u`;
foreach (@mykeys)
{
my $key = $_;
chomp($key);
my $command = "cat OUTPUT_$target/psl_score_byname_$target/$chromosome.table|grep -w $key";
my @belongs= `$command`;
chomp(@belongs);
my $count = scalar(@belongs);
if ($count == 1)
{
open FILE, ">>OUTPUT_$target/unique_hces_$target/$chromosome.txt" or die $!;
print FILE "@belongs\n";
@belongs =();
}
else {
@belongs =();
}
}
有没有更智能,更快捷的方法来做到这一点? 非常感谢您提前。
重复拍摄哪个项目有重要吗? –
因为您必须扫描整个文件,所以在这里排序文件似乎并不需要,您可以选择将第一个或最后一个项目放入一组重复项中。 –
不,在这一点上,我想避免所有的重复。在前面的示例中,我不想保留包含chr1.1.6.490869.491234 – Vasilis