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