벡터에서 한 번만 발생하는 값 가져오기

벡터에서 한 번만 발생하는 값 가져오기

오름차순으로 된 숫자 벡터가 있습니다(t8_이라고 부르세요).

2 7 8 9 11 15 34 91 91 92 94

문제는 일부 숫자가 두 번 나타난다는 것입니다. 삭제하고 싶지 않지만 두 개의 다른 번호여야 합니다.아니요부동 소수점. 내 첫 번째 생각은 벡터를 반복하는 것이었습니다.

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 -u( sort -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

출력이 예상했거나 원했던 것과 다른 경우 알려 주시기 바랍니다.


고쳐 쓰다: 이 버전은 한 줄씩 처리하는 대신 stdin의 모든 줄에 있는 모든 정수를 하나의 입력으로 처리합니다. 어떤 길이의 줄도 수용할 수 있습니다.

#!/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 사이의 숫자를 추가하여 아직 존재하지 않는 요소를 가져옵니다.

관련 정보