4

私が理解できないコーディングの問題を解決できるかどうかを考えていました。私が持っているタブ区切りのデータは、次のようになります。

00001  AU:137  AU:150  AU:180
00001  AU:137  AU:170
00002  AU:180
00003  AU:147  AU:155
00003  AU:155

私が望む出力は次のとおりです。

00001  AU:137  AU:150  AU:180  AU:170
00002  AU:180
00003  AU:147  AU:155

したがって、最初の列 (識別子) は値をマージして重複を削除し、ハッシュになります。重複したキーを持つハッシュにすることはできないため、現在のデータを操作する方法がわかりません。識別子が同じ場合、データを配列にプッシュする方法もわかりません。

コードがなくてすみません。私はいくつか、実際にはかなり多く試しましたが、私のような初心者にも正しく見えません.

どんな助け、提案も大歓迎です。あなたの時間と答えに感謝します。大変感謝しています。

4

3 に答える 3

3

これにより、問題を解決するためのアイデアが得られることを願っています。

use strict;
use warnings;
use Data::Dumper;

my %hash = ();

while (<DATA>) {
    chomp;
    my (@row) = split(/\s+/);
    my $firstkey = shift @row;

    foreach my $secondkey (@row) {
            $hash{$firstkey}{$secondkey}++;
    }
}

print Dumper \%hash;

__DATA__
00001  AU:137  AU:150  AU:180
00001  AU:137  AU:170
00002  AU:180
00003  AU:147  AU:155
00003  AU:15
于 2012-04-16T08:54:18.593 に答える
3

これに対する古典的な解決策は、ハッシュを使用します。実際には、重複する行番号と行ごとに重複する値があるため、ハッシュのハッシュです。

このプログラムは、必要な出力を生成します。データ ファイルがコマンド ラインで渡されることを想定しています。

use strict;
use warnings;

my %data;

while (<>) {
  chomp;
  my ($key, @items) = split /\t/;
  $data{$key}{$_}++ for @items;
}

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

出力

00001 AU:137  AU:150  AU:170  AU:180
00002 AU:180
00003 AU:147  AU:155

または、コマンドライン ソリューションを好む場合

perl -aF/\t/ -lne'$k=shift @F; $d{$k}{$_}++ for @F; END{print join "\t", $_, sort keys %{$d{$_}} for sort keys %d}' myfile

(現時点では Windows でしかテストできないため、少し調整が必要になる場合があります。)

于 2012-04-17T16:40:58.040 に答える
0

脚本:

#!/usr/bin/perl

use strict;
use warnings;

my %hash;
sub uniq { return keys %{{map {$_=>1} @_}}; }

open my $fh, '<input.txt' or die $!;
foreach (<$fh>) {
  $hash{$1} .= $2 if /^(\S+)(\s.*?)[\n\r]*$/;
}
close $fh;

foreach (sort keys %hash) {
  my @elements = uniq split /\t/, $hash{$_};
  print "$_\t", join(' ', sort @elements), "\n";
}

出力:

00001    AU:137 AU:150 AU:170 AU:180
00002    AU:180
00003    AU:147 AU:155
于 2012-04-16T13:20:07.140 に答える