昇順の数値ベクトルがあります(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