0

私はPerlの初心者です。誰でも私にいくつかの提案をしてくれ、ここで助けてくれることに感謝します。

私はファイルを持っています:


A1a01   A1a03  
A1a03   A1a0b  
A1a0b   A1a2a  
A1a2a   A1a02  
A1app   A1a06  
Ala06   A1a07  
A1b0v   A1b0c  
Alb0c   Alb55  
A1b55   A1b04  
..      ..  
..      ..  
.  
.  
.  

順次データを抽出して異なるグループに出力したいと考えています。例からわかるように、グループは A1a01 から A1a02、A1app から A1a07、および A1b0v から A1b04 です。各グループは順番に並んでいます。

これまでのところ、以下のコードを試しましたが、必要なものを取得できません。column1 と column2 を比較した後、一致した名前のみを印刷することができました。一致しない名前を抽出する方法がわかりません。(列 1 の 2 番目の名前と 2 行のデータの列 2 の 1 番目の名前を比較した後、順序は連続していません。)そして、各グループの姓名を出力する必要があります。

use strict;  
use warnings;  

my $i;  
my $j;  
my @column1;  
my @column2;  
my @array1;  
my $lastname;  


@column1=`awk '{print \$1}' saved4`;  
@column2=`awk '{print \$2}' saved4`;  

    for ($i=0;$i<=$#column1;$i++){  
        for ($j=0;$j<=$#column2;$j++){  
                if ($column1[$i]=~ /$column2[$j]/){  

                   push (@array1,$column2[$j]);   
                           }  

        else {  
            $lastname = $column2[$j];  
            }  

            }  
}  

print "$column1[0] @array1 $lastname\n";  

期待される結果は次のようになります。

group1:  
A1a01   A1a03  
A1a03   A1a0b  
A1a0b   A1a2a  
A1a2a   A1a02  

group2:  
A1app   A1a06  
Ala06   A1a07  

group3:  
A1b0v   A1b0c  
Alb0c   Alb55  
A1b55   A1b04  
4

4 に答える 4

3

これはワンライナーで行うことができます:

perl -lane 'print "group".++$i.":" if $a ne $F[0]; print; $a = $F[1];' group.txt

出力:

group1:
A1a01   A1a03
A1a03   A1a0b
A1a0b   A1a2a
A1a2a   A1a02
group2:
A1app   A1a06
A1a06   A1a07
group3:
A1b0v   A1b0c
A1b0c   A1b55
A1b55   A1b04

説明:

  • -l入出力で改行を処理する
  • -a空白で入力を自動分割し、余分な空白を取り除きます
  • -nファイルから標準入力または入力を読み取る
  • @F配列自動分割要素が格納されます

基本的に、このコードはファイル (または標準入力) の各行に対してループします。行の最初の値が前の行の 2 番目の値と等しくない場合、新しいグループ ヘッダーが出力され、カウンターが 1 つインクリメントされます。

警告をオンにすると、このコードで 2 つの警告が表示されますが、ここでは無害であるため (最初のチェックの初期化されていない警告をオンにし$a、タイプミスの警告をオンにし$iます)、警告をオンにしないことにしました。

このワンライナーの完全なコードは次のとおりです。

$/ = "\n";
$\ = "\n";
while (<>) {
    chomp;
    our(@F) = split(' ', $_, 0);
    print 'group' . ++$i . ':' if $a ne $F[0];
    print $_;
    $a = $F[1];
}
于 2013-01-21T17:14:59.080 に答える
1
my %groups = (A1a01 => 1, A1app => 2, A1b0v => 3);

open my $FILE, '<', $ARGV[0] or die "Could not read file $ARGV[0]: $!";

flock $FILE, 2;

while ( <$FILE> ) {
    chomp;

    my @cols = split /\s/;

    print "\nGroup #$groups{ $cols[0] }:\n" if $groups{ $cols[0] };

    print join (' ', @cols), "\n";
}

close $FILE;
于 2013-01-21T15:47:46.803 に答える
0
#!/usr/bin/perl
use warnings;
use strict;

my (@arr1,@arr2);
open my $fh, '<', 'file' or die $!;
while(<$fh>){
        my ($x,$y)= split;
        push @arr1, $x;
        push @arr2, $y;
}
close $fh;

my $cnt=1;
print "Group $cnt \n";
my $i=0;
while (1) {
        if ($arr1[$i+1] eq $arr2[$i]){
                print "$arr1[$i]  $arr2[$i] \n";
        }else{
                print "$arr1[$i]  $arr2[$i] \n";
                print "Group ", ++$cnt , "\n";
        }
        $i++;
        if ($i+1==@arr1){
                print "$arr1[$i]  $arr2[$i] \n";
                last;
        }
}

これを実行すると:

Group 1
A1a01  A1a03
A1a03  A1a0b
A1a0b  A1a2a
A1a2a  A1a02
Group 2
A1app  A1a06
A1a06  A1a07
Group 3
A1b0v  A1b0c
A1b0c  A1b55
A1b55  A1b04

注: あなたのファイルは適切ではありません。いくつかの場所では、'1' ではなく 'l' として指定されています。

于 2013-01-21T15:48:15.103 に答える
-1
use strict;  
use warnings;  

my $i;  
my $j;  
my @column1;  
my @column2;  
my @array1;  
my $lastname;  

@column1=`awk '{print \$1}' saved4`;  
@column2=`awk '{print \$2}' saved4`;  

chomp @column1;
chomp @column2;

my @allGroups;
my $group = [ "- " . $column1[0] . "    " . $column2[0]];

for ($i = 0; $i <= $#column2; $i++){

    if ($i < $#column1-1) {

      if ($column2[$i]=~ /$column1[$i+1]/) {  

          push (@$group, "- " . $column1[$i+1] . "    " . $column2[$i+1]);

      } else {
          push (@allGroups, $group);
          $group = [ " - " . $column1[$i+1] . "    " . $column2[$i+1]];
      }  
    }  
}
foreach my $arr (@allGroups) {
   print "\n\nNEW GROUP\n";
   print @$arr;
}

出力:

NEW GROUP
A1a01    A1a03 A1a03    A1a0b A1a0b    A1a2a A1a2a    A1a02

NEW GROUP
A1app    A1a06 A1a06    A1a07

NEW GROUP
A1b0v    A1b0c A1b0c    Alb55
于 2013-01-21T15:43:31.500 に答える