Как сформировать матричную таблицу

File1 имеет три столбца. Столбец 1 имеет группы, столбец 2 содержит названия метаболических путей, принадлежащих к определенной группе, столбец 3 содержит некоторые значения для каждого пути:

 group1  pathway1  0.664   
 group1  pathway6  1  
 group1  pathway2  0.056  

 group2  pathway2  0.321  
 group2  pathway3  0.771

File2 имеет список всех путей:

 pathway1  
 pathway2  
 pathway3  
 pathway4  
 pathway5  
 pathway6  

Вывод: как получить матричную таблицу, которая выглядит следующим образом:

          group1  group2    
pathway1  0.664
pathway2  0.056   0.321
pathway3          0.771
pathway4  
pathway5  
pathway6  1 

person Saisha    schedule 10.03.2017    source источник
comment
пожалуйста, укажите, на каком языке вы пытаетесь?   -  person Mausam Sinha    schedule 10.03.2017
comment
@MausamSinha Я новичок в Linux. Любое не слишком сложное решение будет оценено по достоинству!   -  person    schedule 10.03.2017
comment
Вы не только хотите, чтобы люди писали ваш код для вас, но вы также публикуете тот же вопрос снова и снова, чтобы получить больше кода.   -  person Dmitry Grigoryev    schedule 10.03.2017
comment
@DmitryGrigoryev, ты хочешь сказать...? потому что это сообщество не ориентировано на ответы на вопросы, связанные с кодированием и программированием?   -  person Saisha    schedule 11.03.2017


Ответы (2)


С awk:

awk 'BEGIN { print "\t group1\tgroup2";b[1];b[2] }
     FNR==NR{ if ( $1 == "group1" ) a[$2"@"1]=$3;
              if ( $1 == "group2" ) a[$2"@"2]=$3 }
     FNR!=NR { printf $1" ";
               for ( j in b) { 
                   if ( $1"@"j in a) printf a[$1"@"j]"\t" ;
                   else printf "\t"};print "" }' File1 File2

Вывод:

         group1 group2
pathway1 0.664
pathway2 0.056  0.321
pathway3        0.771
pathway4
pathway5
pathway6 1
person jijinp    schedule 10.03.2017

Файл1 -> имеет 3 столбца, Файл2 -> список всех путей.

    perl -wMstrict -Mvars='*h' -lane '

       # Step: Gather data & populate the hash
       if ( @ARGV ) {
          next if @F < 3;
          my( $group, $pathway, $value ) = @F;
          $h{ $group }{ $pathway } = $value;
       } else {
          push @h, $_;
       }

       END{
          my @data;

          # Step: Prepare the tabular data
          for my $pathway ( @h ) {
             my @line = ( $pathway );

             for my $group ( sort keys %h ) {
                push @line, $h{ $group }{ $pathway } ||= q||;
             }

             push @data, [join ",", @line];
          }

          # Dynamiclly build the tbl template
          print for(
             q{.TS},

             join( ",", qw/ allbox center /, q/tab(,);/ ),

             ( "c " x (1+keys %h) ),

             ( qw/l/, "n " x (-1+keys %h), qw/n./ ),

             join( ",", q{}, sort keys %h ),

             join( "\n", map { @$_ } @data ),

             q{.TE},
          );
       }
' file1 file2 \
| tbl - | nroff -Tascii -ms | grep '.'

Вывод

            +---------+--------+--------+
            |         | group1 | group2 |
            +---------+--------+--------+
            |pathway1 | 0.664  |        |
            +---------+--------+--------+
            |pathway2 | 0.056  | 0.321  |
            +---------+--------+--------+
            |pathway3 |        | 0.771  |
            +---------+--------+--------+
            |pathway4 |        |        |
            +---------+--------+--------+
            |pathway5 |        |        |
            +---------+--------+--------+
            |pathway6 | 1      |        |
            +---------+--------+--------+
person Community    schedule 10.03.2017