ベクトルで一度だけ発生する値を取得する

ベクトルで一度だけ発生する値を取得する

昇順の数値ベクトルがあります(t8_と呼びます)。

2 7 8 9 11 15 34 91 91 92 94

問題は、いくつかの数字が2回現れることです。削除したくありませんが、2つの異なる番号でなければなりません。いいえ浮動小数点。私の最初の考えは、ベクトルを繰り返すことでした。

which(duplicated(t8)) - that would be 9 and then go on 

t8[which(duplicated(t8))]<-t8[which(duplicated(t8))]+1

次のベクトルは

2 7 8 9 11 15 34 91 92 92 94

同じ手順を繰り返します。

which(duplicated(t8)) - that would be 10 and the go on 

t8[which(duplicated(t8))]<-t8[which(duplicated(t8))]+1

ベクトルが次のような場合

 2 7 8 9 11 15 34 91 92 993 94

私は試しましたsort -usort -nu動作しません)。

これ以上の重複数がなくなるまで対話的にこれを実行できるPerlまたはPythonメソッドはありますか?

関数に入れるファイルでこれを行いたい...編集...

私のベクトルファイルでは答えは機能しません。 https://www.dropbox.com/s/vp67eiw4ns9rr07/num?dl=0

答え1

次のスクリプトは、標準入力の各行から整数ベクトルを読み込みます。

#!/bin/bash

while read -a vec; do
        # INT_MIN for bash: 32-bit bash also supports 64-bit integers.
        min=$((-1<<63)) 
        for ((i = 0; i < ${#vec[@]}; i++)); do
                (( min = vec[i] = vec[i] > min ? vec[i] : min + 1 ))
        done
        echo "${vec[@]}"
done

入力例:

2 7 8 9 11 15 34 91 91 92 94
1 1 1 1 1 1 1 1 1 1
91 91 91
-1000 -900 -100 -100 -100 0 0 0
5 4 3 2 1 0
 1      1  1 1 1 

出力例:

$ ./script.sh < input.txt 
2 7 8 9 11 15 34 91 92 93 94
1 2 3 4 5 6 7 8 9 10
91 92 93
-1000 -900 -100 -99 -98 0 1 2
5 6 7 8 9 10
1 2 3 4 5

出力が期待したか望んでいたものと異なる場合は、お知らせください。


修正する: このバージョンは1行ずつ処理するのではなく、stdinのすべての行にあるすべての整数を1つの入力として扱います。任意の長さの行を収容できます。

#!/bin/sh

min=$((-1<<63))

tr -s '[:space:]' '\n' |
while read val; do
        case ${val#[-+]} in
                ''|*[!0-9]*) continue ;;
        esac
        min=$((val > min ? val : min + 1))
        echo $min
done |
paste -s -d' ' -

セッション例:

$ echo -e '2 7 8 9 11 15 34 91 91 92 94' | ./script.sh
2 7 8 9 11 15 34 91 92 93 94
$ echo -e '91 91 91' | ./script.sh
91 92 93
$ echo -e '5 4 3 2 1 0' | ./script.sh
5 6 7 8 9 10
$ echo -e '-1000 -900 -100 -100 -100 0 0 0 +100 +100 +100' | ./script.sh
-1000 -900 -100 -99 -98 0 1 2 100 101 102
$ echo -e ' 1 1\n 1\n 1 \n1 \n1 ' | ./script.sh
1 2 3 4 5 6
$ echo -e 'a 1 b 2 3 c' | ./script.sh
1 2 3

答え2

たぶんこれがあなたに必要なものかもしれません:

#!usr/bin/perl                                                                                                                                                
use strict;
use warnings;

my@list=qw(2 7 8 9 11 15 34 91 91 92 94);
my%hash;


print "Input:\n@list\n";

foreach(@list)
{
    #count occurences for each element                                                                                                                        
    $hash{$_}++;
}

foreach my$key (keys %hash)
{
    TURN: while($hash{$key}>1)
    {
    #add a number between 1 and 10 to the duplicated value if                                                                                             
    #this value does not already exist                                                                                                                    
        for(my$i=1;$i<=10;$i++)
        {
            if(exists $hash{$key+$i})
            {
                next;
            }
            else
            {
                $hash{$key}--;
                $hash{$key+$i}=1;
                next TURN;
            }
        }
    }
}

my@result=sort{$a<=>$b}(keys %hash);

print "Result:\n@result\n";

このコードは、各要素の発生回数を計算し、値に 1 から 10 までの数字を追加して、まだ存在していない要素を取得します。

関連情報