目的:
制表符分隔文件包含不同的字符串。有些元素是相同的,有些则不是。我想在同一行“连接”特定元素。但是,在这个操作中,我需要对特定元素进行更改以将它们彼此分开,例如,在最后添加一个数字。
INPUT(在 @input 中):
File1 2 range-2 operation execute:error 12345444,294837,298774
File2 3 range-1 default range:error 349928,37224
...
我想连接“字段”执行:错误与12345444,294837,298774和范围:错误与349928,37224,给这个:
输出:
execute:error-1
12345444
execute:error-2
294837
execute:error-3
298774
range:error-1
349928
range:error-2
37224
PERL代码: 我正在考虑使用@input对@input中的元素执行foreach循环。哈希计算用逗号分隔的最后“列”中的“字符串”的数量,并以某种方式添加一个数字(例如,等于总哈希值-1,制作一个计数器?)。但是,这有点过头了。我怎么能这样做?我尝试了一下,但在大约两个小时的尝试和阅读并搜索类似问题后停止了。也许我不应该使用哈希?
my @output = ();
foreach (@input) {
our(@F) = split('\t', $_, 0);
my @end_numbers = split(',', $F[5], 0);
%count;
foreach (@end_numbers) {
++$count{$_};
my $counts = keys %count;
my $output = $F[4] . (adding a value here, e.g. $counts -1 for each loop itteration ) "\n" . $_;
push (@output, $output);
}
}
解: 根据@ikegami的建议。
my @output = ();
my %counts = ();
foreach (@input) {
chomp $_;
my @fields = split(/\t/, $_, 0);
for my $num (split /,/, $fields[5]) {
++$counts{$fields[4]};
my $output = $fields[4] . "_" . $counts{$fields[4]} . "\n" . $num . "\n";
push (@output, $output);
}
}
答案 0 :(得分:1)
您尝试连接的值是$count{$_}
。
my %counts;
while (<>) {
chomp;
my ($class, $nums) = ( split /\t/ )[4,5];
for my $num (split /,/, $nums) {
++$counts{$class};
print "$class-$counts{$class}\n";
print "$num\n";
}
}
或者保存一行:
printf "%s-%s\n", $class, ++$counts{$class};
printf "%s\n", $num;
如果您想要为每一行输入重置计数,请在外部循环内使用my $count;
而不是my %counts;
,并使用$count
代替$counts{$class}
。
答案 1 :(得分:-1)
只需使用map函数将字符串$F[4].--$count."\n$_\n"
添加到$F[5]
spitted列表中的每个数字
foreach (@input) {
my @F = split(/\t/, $_, 0);
my $count = 0;
my @end_numbers = map { $F[4]. --$count .qq|\n$_\n| } split(/,/, $F[5], 0);
print @end_numbers;
}