如何从标题行中的匹配字符串打印列

时间:2016-06-27 06:01:34

标签: perl shell

我有一个矩阵,其中第一行有标题,在它们下面有一些值。我想重新排序列。 e.g。

输入:

Ajay vijay ramu shyamu divya jagat nitin

5 7 6 5 7 5 6

6 5 6 4 6 7 4

输出:

Ajay divya jagat nitin ramu shyamu vijay

5 7 5 6 6 5 7

6 6 7 4 6 4 5

4 个答案:

答案 0 :(得分:1)

此解决方案以您需要的顺序从标头的数组@required开始。然后它使用从文件中读取的第一行来构建一个数组@indexes,其中包含 slice 的索引值,它将根据需要对每一行重新排序

此后只需打印每行的切片

use strict;
use warnings 'all';

my @required = map lc, qw/ Ajay divya jagat nitin ramu shyamu vijay /;

my @indexes;

while ( <> ) {

  my @fields = split;

  unless ( @indexes ) {
    my %indexes = map { lc $fields[$_] => $_ } 0 .. $#fields;
    @indexes = @indexes{@required};
  }

  print "@fields[@indexes]\n";
}

输出

Ajay divya jagat nitin ramu shyamu vijay
5 7 5 6 6 5 7
6 6 7 4 6 4 5

答案 1 :(得分:0)

您可以创建一个哈希映射输入字位置到所需位置,然后通过将它们分开并为哈希中的每个位置查找所需的单词来重新排序。

This text should be Arial.
  <b>  Home Services Careers Feedback Privacy Policy Referral </b>
  <br>
  <span class="other">This text can be Arial sans-serif or Helvatica </span>
  <b class="other">  Home Services Careers Feedback Privacy Policy Referral </b>

要获得排列,请将其称为my %order = map { $_ => $ARGV[$_] } 0..$#ARGV; while(<STDIN>) { my @fields = split /\s+/, $_; print join(" ", map { $fields[$order{$_}] } 0..$#ARGV), "\n"; }

答案 2 :(得分:0)

到目前为止,还没有人要求提供作者的代码,所以我也会发布我的解决方案:

#!/usr/bin/perl
use strict;
use warnings;
my (%map);
while(<>){ 
    chomp;
    my @F=split;
    if (!keys %map) {
        my @headers= map { [ $F[$_], $_ ] } 0..@F-1; # original order
        my @sorted = sort { $a->[0] cmp $b->[0]} @headers; # columns sorted
        my $i=0;
        %map = map { $i++ => $_->[1] } @sorted; # reorder map 
    }
    for (my $i=0;$i<@F;$i++) {
        print $F[$map{$i}], ' ';
    }
    print "\n";
}

答案 3 :(得分:-1)

我已经为您的数据使用了哈希。

my $filename ="file.txt"; #provide your filename here
open FH, $filename or die "Error\n";
my %myhash;
my @header;
my $count=0;
while(<FH>)
{
    chomp($_);
    my @arr = split(/\s/, $_); # check the delimiter here
    if($. ==1)
    {
        @header = @arr;
    }
    else
    {
        for(my $i =0; $i<=$#arr;$i++)
        {
                $myhash{$header[$i]}{$count}=$arr[$i];
        }
        $count++;
    }

}

foreach my $id( sort {lc $a cmp lc $b} keys  %myhash)
{
        print "$id\t";
}
print "\n";

for(my $i=0; $i < $count;$i++)
{
        foreach my $id( sort {lc $a cmp lc $b} keys  %myhash)
        {
                print "$myhash{$id}{$i}\t";

        }
        print "\n";
}

希望这对你有用