我有這個輸入數據:如何分組相等的值並用Perl打印最小和最大參數?
miRNA17 dvex571195 207 230
miRNA17 dvex571195 189 229
miRNA17 dvex571195 207 241
miRNA17 dvex571195 207 230
miRNA17 dvex571195 80 111
miRNA18 dvex449276 12 43
miRNA18 dvex196735 2909 2929
miRNA18 dvex765590 183 213
miRNA22 dvex826214 206 236
miRNA23 dvex529006 111 168
miRNA24 dvex803612 317 347
我想組相同的第一和第二個值的行。接下來,在這個「組」中,我需要在第三列中輸出「組」的最小值,在第四列中輸出「組」的最大值。輸出將是:
miRNA17 dvex571195 80 241
miRNA18 dvex449276 12 43
miRNA18 dvex196735 2909 2929
miRNA18 dvex765590 183 213
miRNA22 dvex826214 206 236
miRNA23 dvex529006 111 168
miRNA24 dvex803612 317 347
我試圖將所有數據分組在一個大%哈希,我的密鑰由第一和第二列表示。但我可以使用一種方法來組織後繼列。該代碼是:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %lines; # hash with 1rd and 2th elements as key
my %first_line_per_group; # stores in which line a group appeared first
while(my $line = <>) {
# remove line break
chomp $line;
# retrieve elements form line
my @elements = split /\s+/, $line;
# build key from elements 1 and 2 (array 0-based!)
my $key = $elements[0]." ".$elements[1];
if(! $lines{key}) {
#my $min = max $elements[3];
$first_line_per_group{$key} = $elements[0]."\t".$elements[1];#."\t".$min;
}
push @{ $lines{$key} }, $line;
}
# the result:
for my $key (keys %lines) {
print $first_line_per_group{$key}."\t";
print "$_\n" for @{ $lines{$key} };
}
這段代碼的輸出是:
miRNA17 dvex571195 miRNA17 dvex571195 207 230
miRNA17 dvex571195 189 229
miRNA17 dvex571195 207 241
miRNA17 dvex571195 207 230
miRNA17 dvex571195 80 111
miRNA18 dvex449276 miRNA18 dvex449276 12 43
miRNA18 dvex196735 miRNA18 dvex196735 2909 2929
miRNA18 dvex765590 miRNA18 dvex765590 183 213
miRNA22 dvex826214 miRNA22 dvex826214 206 236
miRNA23 dvex529006 miRNA23 dvex529006 111 168
miRNA24 dvex803612 miRNA24 dvex803612 317 347
但我需要消除分組值,並做上述工作。
所需輸出保留由第一行順序;是故意的,還是將它分類是可以接受的? – ysth