Perl 如何将连续数据分组

Perl 如何将连续数据分组,perl,Perl,我是Perl的新手。谢谢任何人能给我一些建议和帮助 我有一个文件: 我想将顺序数据提取并打印到不同的组中。从给出的示例中可以看到,这些组从A1a01到A1a02,从A1app到A1a07,从A1b0v到A1b04。每组按顺序排列 到目前为止,我已经尝试了下面的代码,但它无法得到我需要的。我只在比较了第1列和第2列之后才打印出那些匹配的名称。我不知道如何提取不匹配的名称。(比较两行数据的第1列第2个名称和第2列第1个名称后,不按顺序排列。)我需要打印每个组的名字和姓氏 use strict;

我是Perl的新手。谢谢任何人能给我一些建议和帮助

我有一个文件:


我想将顺序数据提取并打印到不同的组中。从给出的示例中可以看到,这些组从A1a01到A1a02,从A1app到A1a07,从A1b0v到A1b04。每组按顺序排列

到目前为止,我已经尝试了下面的代码,但它无法得到我需要的。我只在比较了第1列和第2列之后才打印出那些匹配的名称。我不知道如何提取不匹配的名称。(比较两行数据的第1列第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";  
my%groups=(A1a01=>1,A1app=>2,A1b0v=>3);
打开我的$FILE,“
my%groups=(A1a01=>1,A1app=>2,A1b0v=>3);
打开我的$FILE,'
注意:您的文件不正确,在某些地方,它被指定为“l”,而不是“1”


注意:您的文件不正确,在某些地方,它被指定为“l”,而不是“1”。

这可以用一行代码完成:

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
说明:

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
    数组自动拆分元素存储在
基本上,该代码针对文件(或stdin)中的每一行循环,如果行上的第一个值不等于前一行的第二个值,则打印一个新的组头,并且计数器递增一

如果您打开了警告,您将收到两个带有此代码的警告,但由于它们在这里是无害的(第一次检查
$a
时未初始化的警告和
$i
时的打字警告),我选择不打开警告

这一班轮的完整代码为:

$/ = "\n";
$\ = "\n";
while (<>) {
    chomp;
    our(@F) = split(' ', $_, 0);
    print 'group' . ++$i . ':' if $a ne $F[0];
    print $_;
    $a = $F[1];
}
$/=“\n”;
$\=“\n”;
而(){
咀嚼;
我们的(@F)=分割('',$,0);
打印'group.+$i.':'if$a ne$F[0];
打印美元;
$a=$F[1];
}

这可以用一个衬里完成:

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
说明:

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
    数组自动拆分元素存储在
基本上,该代码针对文件(或stdin)中的每一行循环,如果行上的第一个值不等于前一行的第二个值,则打印一个新的组头,并且计数器递增一

如果您打开了警告,您将收到两个带有此代码的警告,但由于它们在这里是无害的(第一次检查
$a
时未初始化的警告和
$i
时的打字警告),我选择不打开警告

这一班轮的完整代码为:

$/ = "\n";
$\ = "\n";
while (<>) {
    chomp;
    our(@F) = split(' ', $_, 0);
    print 'group' . ++$i . ':' if $a ne $F[0];
    print $_;
    $a = $F[1];
}
$/=“\n”;
$\=“\n”;
而(){
咀嚼;
我们的(@F)=分割('',$,0);
打印'group.+$i.':'if$a ne$F[0];
打印美元;
$a=$F[1];
}

您是否有意在示例输入/输出中混用
1
(数字1)和
l
(小写l),或者这是一个打字错误?您是否有意在示例输入/输出中混用
1
(数字1)和
l
(小写l),或者是一个打字错误?在单个空格上拆分可能不是一个好主意,改为使用默认拆分。此外,这也使得这些组难以编码,而不是一个非常有用的解决方案,因为它需要您首先浏览输入。在单个空格上拆分可能不是一个好主意,请使用默认拆分。此外,这也使得这些组被硬编码,而不是一个非常有用的解决方案,因为它需要您首先浏览输入。谢谢@Guru。这正好符合我需要的=)谢谢@Guru。这刚好与我需要的匹配=)我尝试了你的代码。它工作得很好。非常感谢=)我试过你的代码。它工作得很好。非常感谢
group1:
A1a01   A1a03
A1a03   A1a0b
A1a0b   A1a2a
A1a2a   A1a02
group2:
A1app   A1a06
A1a06   A1a07
group3:
A1b0v   A1b0c
A1b0c   A1b55
A1b55   A1b04
$/ = "\n";
$\ = "\n";
while (<>) {
    chomp;
    our(@F) = split(' ', $_, 0);
    print 'group' . ++$i . ':' if $a ne $F[0];
    print $_;
    $a = $F[1];
}