このperl
スクリプトは、作業できるはずのハッシュを構築します。便宜上、データ構造をダンプするList::MoreUtils
ためuniq
に使用しました。Data::Printer
#!/usr/bin/env perl
use strict;
use warnings;
use List::MoreUtils qw(uniq);
use DDP;
my %paper ;
my @categories;
while (<DATA>){
chomp;
my @record = split /\t/ ;
$paper{$record[0]} = { map { $_ => 1 } @record[1..$#record] } ;
push @categories , @record[1..$#record] ;
}
@categories = uniq @categories;
foreach (keys %paper) {
foreach my $category(@categories) {
$paper{$_}{$category} //= 0 ;
}
};
p %paper ;
__DATA__
19801464 Animals Biodiversity Computational Biology/methods DNA
19696045 Environmental Microbiology Computational Biology/methods Software
出力
{
19696045 {
'Animals Biodiversity' 0,
'Computational Biology/methods' 1,
DNA 0,
'Environmental Microbiology' 1,
Software 1
},
19801464 {
'Animals Biodiversity' 1,
'Computational Biology/methods' 1,
DNA 1,
'Environmental Microbiology' 0,
Software 0
}
}
そこから必要な出力を生成するにはprintf
、行を適切にフォーマットする必要がある場合があります。あなたの目的には、以下で十分かもしれません。
print "\t", (join " ", @categories);
for (keys %paper) {
print "\n", $_, "\t\t" ;
for my $category(@categories) {
print $paper{$_}{$category}," "x17 ;
}
}
編集
出力をフォーマットするためのいくつかの代替手段... (配列x
内の要素の長さまたは数でフォーマット セクションを乗算して、それらが一致するようにするために使用します):@categories
使用するformat
my $format_line = 'format STDOUT =' ."\n"
. '@# 'x ~~@categories . "\n"
. 'values %{ $paper{$num} }' . "\n"
. '.'."\n";
for $num (keys %paper) {
print $num ;
no warnings 'redefine';
eval $format_line;
write;
}
使用printf
:
print (" "x9, join " ", @categories, "\n");
for $num (keys %paper) {
print $num ;
map{ printf "%19d", $_ } values %{ $paper{$num} } ;
print "\n";
}
使用form
:
use Perl6::Form;
for $num (keys %paper) {
print form
"{<<<<<<<<}" . "{>}" x ~~@categories ,
$num , values %{ $paper{$num} }
}
データの処理方法によっては、残りの分析を perl で行うことができる場合があるため、印刷用の正確な書式設定は、ワークフローの後の段階まで優先されない可能性があります。アイデアについては、 BioPerlを参照してください。