2015-08-03 3 views
-7

У меня есть файл с номером на каждой строке.Альтернативная функция совпадения perl

1 
7 
9 
15 
22 
29 
30 
30 <-- 
30 <-- 
30 <-- 
40 
42 
49 
50 
50 <-- 
50 <-- 
55 

Я не могу позволить номерам появляться более одного раза. Когда дубликат найден, он вместо этого должен заменить его на следующий неиспользованный номер.

1 
7 
9 
15 
22 
29 
30 
31 <-- 
32 <-- 
33 <-- 
40 
42 
49 
50 
51 <-- 
52 <-- 
55 

Если я кладу в колонку из таблицы в Perl, AWK патч в Баш скрипт ... как я мог придумать с этим решением? Любая идея, было бы удивительно ...

+4

вы пробовали что-нибудь и получить некоторую ошибку? Пожалуйста, напишите, что – Amareesh

+0

Попробуйте ['List :: MoreUtils :: uniq'] (https://metacpan.org/pod/List::MoreUtils#uniq-LIST) .. Пример:' perl -MList :: MoreUtils = uniq - E '@ a = uniq (1,1,2,2,3); скажем, «@a» '' –

+0

@ Håkon Hægland, который не производит запрошенный выход. – ikegami

ответ

1

Использование unique в R:

> v<-c(1,7,9,15,22,29,30,30,30,30,40,42,49,50,50,50,55) 
> unique(v) 

[1] 1 7 9 15 22 29 30 40 42 49 50 55 

Или в PERL скрипт, используйте хеш:

my @list = qw(1 7 9 15 22 29 30 30 30 30 40 42 49 50 50 50 55); 

my %nums; 

$nums{$_}++ foreach @list; 

say foreach sort {$a <=> $b } keys %nums; 
+0

было бы хорошо, если бы он мог сделать это для любого входного файла, в котором цифры равны 1 числу на ро ... – sdji

+6

@sdji: Возьмите его как упражнение. Не просите ложного кормления. –

+0

выход shoudl также 1 столбец с numbe rin каждый ro – sdji

2

Вот решение Баш 4, проблема в том, что bash не имеет сортировки.

Редактировать Пытается следовать комментариям, возможно, это то, что требуется?

declare -A assoc 
while read key 
do 
    while [[ -n ${assoc[$key]} ]] 
    do 
     ((key++)) 
    done 

    assoc[$key]=1 

done < vector.txt 

oldIFS="$IFS" 
IFS=$'\n' 
echo "${!assoc[*]}" | sort -n > out.txt 
IFS="$oldIFS" 

Содержание vector.txt:

1 
7 
9 
15 
22 
29 
30 
30 
30 
30 
40 
42 
49 
50 
50 
50 
55 

Содержание из out.txt:

1 
7 
9 
15 
22 
29 
30 
31 
32 
33 
40 
42 
49 
50 
51 
52 
55 

решение Perl, который делает то же самое:

use strict; 
use warnings; 

my %assoc; 
my $fname = 'vector.txt'; 

open(my $in, $fname) or die "Unable to open '$fname': $!"; 
while (my $key = <$in>) { 

    chomp($key); 
    $key++ while exists $assoc{$key}; 
    $assoc{$key} = undef; 

} 
close $in; 

my @output = sort {$a <=> $b} keys(%assoc); 
local $" = "\n"; 
open(my $out, '>', 'out.txt') or die "Unable to open 'out.txt': $!"; 
print $out "@output\n"; 
close $out; 
+0

это shoudl не будет только 30 bur, как в строке выше с 30 плюс 1 30 плюс 2 30 плюс 3 ... вы можете edi? – sdji

+0

@sdji: редактировать сделано, как это сейчас? – cdarke

Смежные вопросы