昇順の数値ベクトルがあります(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 -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
出力が期待したか望んでいたものと異なる場合は、お知らせください。
修正する: このバージョンは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 までの数字を追加して、まだ存在していない要素を取得します。