ЦЕЛЬ:
Файл, разделенный табуляцией, содержит разные строки. Некоторые элементы идентичны, некоторые нет. Я хотел бы «объединить» определенные элементы в одной строке. Однако в этой операции мне нужно внести изменения в конкретный элемент, чтобы отделить их друг от друга, например. добавление числа в конец.
ВВОД (в @input):
File1 2 range-2 operation execute:error 12345444,294837,298774
File2 3 range-1 default range:error 349928,37224
...
Я хотел бы объединить «поле» execute:error с 12345444,294837,298774 и range:error с 349928,37224, чтобы получить это:
ВЫХОД:
execute:error-1
12345444
execute:error-2
294837
execute:error-3
298774
range:error-1
349928
range:error-2
37224
PERL CODE: я думал о выполнении цикла foreach для элементов в @input, используя, например, хэши для подсчета количества «строк» в последнем «столбце», разделенных запятыми, и каким-то образом добавить число (например, равное общему хешу -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);
}
}
our
сохранение при принудительном выполнении (например,@ISA
,@EXPORT
и@EXPORT_OK
) - person ikegami   schedule 31.07.2013