perl比较数组和分组的元素
发布时间:2020-12-15 21:45:24 所属栏目:大数据 来源:网络整理
导读:我回来了另一个问题.我有一个数据列表: 1 L DIELTQSPE H EVQLQESDAELVKPGASVKISCKASGYTFTDHE2 L DIVLTQSPRVT H EVQLQQSGAELVKPGASIKDTY3 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAN4 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAG5 A ALQLTQSPSSLS
我回来了另一个问题.我有一个数据列表:
1 L DIELTQSPE H EVQLQESDAELVKPGASVKISCKASGYTFTDHE 2 L DIVLTQSPRVT H EVQLQQSGAELVKPGASIKDTY 3 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAN 4 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAG 5 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C LELDKWASL 6 L DIQMTQIPSSLSASLSIC H EVQLQQSGVEVKMSCKASGYTFTS 7 L SYELTQPPSVSVSPGSIT H QVQLVQSAKGSGYSFS P YNKRKAFYTTKNIIG 8 L SYELTQPPSVSVSPGRIT H EVQLVQSGAASGYSFS P NNTRKAFYATGDIIG 9 A MPIMGSSVAVLAIL B DIVMTQSPTVTI C EVQLQQSGRGP 10 A MPIMGSSVVLAIL B DIVMTQSPTVTI C EVQLQQSGRGP 11 L DVVMTQTPLQ H EVKLDESVTVTSSTWPSQSITCNVAHPASSTKVDKKIE 12 A DIVMTQSPDAQYYSTPYSFGQGTKLEIKR 我想比较第三个元素和&&每行的第5个元素,如果它们具有相同的第3个&&第五要素. 3: 3 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAN 4 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAG 5 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C LELDKWASL 9: 9 A MPIMGSSVAVLAIL B DIVMTQSPTVTI C EVQLQQSGRGP 10 A MPIMGSSVVLAIL B DIVMTQSPTVTI C EVQLQQSGRGP Fyi,在实际数据中,第3,第5,第7个元素非常长.我让他们切割看到整体. 这就是我所做的,我知道它非常笨拙,但作为初学者,我正在尽我所能. my $file = <>; open(IN,$file)|| die "no $file: $!n"; my @arr; while (my $line=<IN>){ push @arr,[split (/s+/,$line)] ; } close IN; my (@temp1,@temp2,%hash1); for (my $i=0;$i<=$#arr ;$i++) { push @temp1,[$arr[$i][2],$arr[$i][4]]; for (my $j=$i+1;$j<=$#arr ;$j++) { push @temp2,[$arr[$j][2],$arr[$j][4]]; if (($temp1[$i][0] eq $temp2[$j][0])&& ($temp1[$i][1] eq $temp2[$j][1])) { push @{$hash1{$arr[$i][0]}},$arr[$i],$arr[$j]; } } } print Dumper %hash1; 解决方法
你似乎比它需要的要多得多,但这对初学者来说很常见.想一想如何手动执行此操作:
>看看每一行. 循环和所有这一切是完全没必要的: #!/usr/bin/env perl use strict; use warnings; my ($previous_row,$third,$fifth) = ('') x 3; while (<DATA>) { my @fields = split; if ($fields[2] eq $third && $fields[4] eq $fifth) { print $previous_row if $previous_row; print "t$_"; $previous_row = ''; } else { $previous_row = $fields[0] . "t" . $_; $third = $fields[2]; $fifth = $fields[4]; } } __DATA__ 1 L DIELTQSPE H EVQLQESDAELVKPGASVKISCKASGYTFTDHE 2 L DIVLTQSPRVT H EVQLQQSGAELVKPGASIKDTY 3 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAN 4 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAG 5 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C LELDKWASL 6 L DIQMTQIPSSLSASLSIC H EVQLQQSGVEVKMSCKASGYTFTS 7 L SYELTQPPSVSVSPGSIT H QVQLVQSAKGSGYSFS P YNKRKAFYTTKNIIG 8 L SYELTQPPSVSVSPGRIT H EVQLVQSGAASGYSFS P NNTRKAFYATGDIIG 9 A MPIMGSSVAVLAIL B DIVMTQSPTVTI C EVQLQQSGRGP 10 A MPIMGSSVAVLAIL B DIVMTQSPTVTI C EVQLQQSGRGP 11 L DVVMTQTPLQ H EVKLDESVTVTSSTWPSQSITCNVAHPASSTKVDKKIE 12 A DIVMTQSPDAQYYSTPYSFGQGTKLEIKR (请注意,我稍微更改了第10行,以便第3个字段与第9行匹配,以便在输出中获得指定的相同组.) 编辑:复制/粘贴错误复制了一行代码. 编辑2:在回复评论时,这是第二个版本,它不假设应该分组的行是连续的: #!/usr/bin/env perl use strict; use warnings; my @lines; while (<DATA>) { push @lines,[ $_,split ]; } # Sort @lines based on third and fifth fields (alphabetically),then on # first field/line number (numerically) when third and fifth fields match @lines = sort { $a->[3] cmp $b->[3] || $a->[5] cmp $b->[5] || $a->[1] <=> $b->[1] } @lines; my ($previous_row,$fifth) = ('') x 3; for (@lines) { if ($_->[3] eq $third && $_->[5] eq $fifth) { print $previous_row if $previous_row; print "t$_->[0]"; $previous_row = ''; } else { $previous_row = $_->[1] . "t" . $_->[0]; $third = $_->[3]; $fifth = $_->[5]; } } __DATA__ 1 L DIELTQSPE H EVQLQESDAELVKPGASVKISCKASGYTFTDHE 3 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAN 2 L DIVLTQSPRVT H EVQLQQSGAELVKPGASIKDTY 5 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C LELDKWASL 7 L SYELTQPPSVSVSPGSIT H QVQLVQSAKGSGYSFS P YNKRKAFYTTKNIIG 6 L DIQMTQIPSSLSASLSIC H EVQLQQSGVEVKMSCKASGYTFTS 9 A MPIMGSSVAVLAIL B DIVMTQSPTVTI C EVQLQQSGRGP 8 L SYELTQPPSVSVSPGRIT H EVQLVQSGAASGYSFS P NNTRKAFYATGDIIG 11 L DVVMTQTPLQ H EVKLDESVTVTSSTWPSQSITCNVAHPASSTKVDKKIE 10 A MPIMGSSVAVLAIL B DIVMTQSPTVTI C EVQLQQSGRGP 12 A DIVMTQSPDAQYYSTPYSFGQGTKLEIKR 4 A ALQLTQSPSSLSAS B RITLKESGPPLVKPTCS C ELDKWAG (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容