2016-10-31 6 views
-1

タブ区切りのデータで配列を移入しました。私は他の列で重複を削除せずに最初の列に重複したIDを持つ行をマージしたい:ここ他の列の重複を削除せずに、最初の列の重複した識別子を持つ配列のデータを結合する方法

は、私がコードを実行する前に@fusions配列の行がどのように見えるかです:

enter image description here

所望の出力:

enter image description here

私はハッシュを使用してみましたが、それはすべての列に重複を削除し、私は最初の列に重複を削除する必要があります。 ここでは、私が採用したハッシュを使用したコードを示します。

foreach (@fusions){ 
    chomp($_); 
    my ($key, @items) = split /\t/; 
    $fusion_hash{$key}{$_}++ for @items; 
    } 

#print join("\t", $_, sort keys %{$fusion_hash{$_}}), "\n" for sort keys %fusion_hash; 

データをマージし、他の列の重複を削除しないようにコードを変更する方法をお勧めします。おかげ

+3

データの画像を投稿しないでください。あなたのデータはテキストなので、テキストとして投稿してみませんか?私はあなたの問題に取り組むことができるようにテストファイルにコピーしていましたが、データを再タイピングするつもりはないので、代わりに他の人を助けると思います。 –

+0

あなたの絶対権は、テストすることができませんでした。http://www.onlineocr.net/ once ;-) –

答えて

2

あなたは「キー」仕事をする必要があります

use strict; 
my %fusion_hash; 
my @fusions= split("\n", <<EOT); 
SLC34A2-ROS1.S4R32.COSF1197 chr4 25665952 PASS 56812 SLC34A2 4 COSF1197 
SLC34A2-ROS1.S4R32.COSF1197 chr6 117650609 PASS 56812 ROS1 32 COSF1197 
SLC34A2-ROS1.S4R34.COSF1198 chr4 25665952 PASS 3367 SLC34A2 4 COSF1198 
SLC34A2-ROS1.S4R34.COSF1198 chr6 117645578 PASS 3367 ROS1 34 COSF1198 
EOT 

foreach (@fusions){ 
    chomp($_); 
    my ($key, @items) = split /\s/; 
    $fusion_hash{$key} = [] unless defined $fusion_hash{$key} ; 
    push @{$fusion_hash{$key}}, @items; 
} 

#print join("\t", $_, @{$fusion_hash{$_}}), "\n" for sort keys %fusion_hash; 

あたりの配列内のデータを保存する必要があります。

HTH ゲオルクところで

:これは自動的にperlので行われているように、あなたはライン

 $fusion_hash{$key} = [] unless defined $fusion_hash{$key} ; 

をOMMITすることができます。

+0

このハッシュを後で処理するための配列にダンプする最良の方法は何ですか?ありがとうございました – user3781528

+1

私は正しく理解しているかどうかわかりませんが、ソートキー%fusion_hashの 'push @result、join(" \ t "、$ _、@ {$ fusion_hash {$ _}}) (その前に@ resultを定義した場合) –

2

ゲオルグの答えとは少し異なります。私はデータを2つの部分に分けるだけです(私たちが一致しているビットと残りの部分)。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

my %data; 

while (<DATA>) { 
    chomp; 

    my ($key, $val) = split//, $_, 2; 
    push @{ $data{$key} }, $val; 
} 

foreach (sort keys %data) { 
    say $_, "\t", join "\t", @{ $data{$_} }; 
} 

__DATA__ 
SLC34A2-ROS1.S4R32.COSF1197 chr4 25665952 PASS 56812 SLC34A2 4 COSF1197 
SLC34A2-ROS1.S4R32.COSF1197 chr6 117650609 PASS 56812 ROS1 32 COSF1197 
SLC34A2-ROS1.S4R34.COSF1198 chr4 25665952 PASS 3367 SLC34A2 4 COSF1198 
SLC34A2-ROS1.S4R34.COSF1198 chr6 117645578 PASS 3367 ROS1 34 COSF1198 
+0

%dataのマージされた値を新しい配列にプッシュする方法を教えてください。ありがとう – user3781528

+0

できます。しかし、あなたはプログラマーです。それはあなた自身でそれを働かせるのは難しいことではありません。値がどこに生成されているかを見ることができます。あなたはその価値を持ち、それを配列にプッシュできませんか?あなたがそれを管理することができない場合は、おそらくあなたのためにそれをするために誰かに支払うことを検討する必要があります。 –

+0

'push(@final_array、$ _、" \ t "、" \ t "、@ {$ fusion_hash {$ _}}));を試しましたが、期待通りに動作しません。私はタブで分割しようとすると、テストするだけで、それは位置を2回印刷し、2度目は空白になります。'chomp($ _);' 'my @lineelementarray = split(/ \ t /、$ _);' 'my $ position_1 = $ lineelementarray [1]; print "position:' $ position_1 \ n ";' – user3781528

関連する問題