Если у вас есть дубликаты фамилий, вы можете отсортировать их по имени -
obj.sort(function(a,b){
if(a.last_nom< b.last_nom) return -1;
if(a.last_nom >b.last_nom) return 1;
if(a.first_nom< b.first_nom) return -1;
if(a.first_nom >b.first_nom) return 1;
return 0;
});
$ v=1.2.13
$ echo "${v%.*}.$((${v##*.}+1))"
1.2.14
$ v=11.1.2.3.0
$ echo "${v%.*}.$((${v##*.}+1))"
11.1.2.3.1
Вот как это работает:
Строка разбита на две части.
${v%.*}
${v##*.}
Первая часть печатается как есть, за ней следует простая точка, а последняя часть увеличивается с использованием арифметического расширения оболочки: $((x+1))
Я предпочитаю команду «вырезать» для такого рода вещей
major=`echo $version | cut -d. -f1`
minor=`echo $version | cut -d. -f2`
revision=`echo $version | cut -d. -f3`
revision=`expr $revision + 1`
echo "$major.$minor.$revision"
Я знаю, что это не самый короткий путь, но для меня проще всего понимать и читать ...
Pure Bash с использованием массива:
version='1.2.33'
a=( ${version//./ } ) # replace points, split into array
((a[2]++)) # increment revision (or other part)
version="${a[0]}.${a[1]}.${a[2]}" # compose new version
Еще один способ оболочки (показывающий, что всегда есть больше, чем один способ поиграться с этим материалом ...):
$ echo 1.2.3 | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )
1.2.4
Итак, мы можем сделать:
Я использую собственное разбиение слов в оболочке; что-то вроде
oIFS="$IFS"
IFS=.
set -- $version
IFS="$oIFS"
, хотя вам нужно быть осторожным с номерами версий в целом из-за алфавитных суффиксов или суффиксов даты и других раздражающих противоречивых битов. После этого позиционные параметры будут установлены на компоненты $version
:
$1 = 1
$2 = 2
$3 = 13
($IFS
- это набор отдельных символов, а не строка, поэтому это не будет работать с мультисимволом разделитель полей, хотя вы можете использовать IFS=.-
для разделения на .
или -
.)
Вдохновленный ответом jlliagre , я сделал свою собственную версию , которая поддерживает номера версий, имеющие только основную версию, заданную . Версия jlliagre будет иметь значение 1 -> 1.2 вместо 2.
Эта версия подходит для обоих стилей номеров версий:
function increment_version()
local VERSION="$1"
local INCREMENTED_VERSION=
if [[ "$VERSION" =~ .*\..* ]]; then
INCREMENTED_VERSION="${VERSION%.*}.$((${VERSION##*.}+1))"
else
INCREMENTED_VERSION="$((${VERSION##*.}+1))"
fi
echo "$INCREMENTED_VERSION"
}
Это приведет к следующим выводам:
increment_version 1 -> 2
increment_version 1.2 -> 1.3
increment_version 1.2.9 -> 1.2.10
increment_version 1.2.9.101 -> 1.2.9.102
Awk делает это довольно просто:
echo "1.2.14" | awk -F \. {'print $1,$2, $3'}
распечатает 1 2 14.
флаг -F указывает разделитель.
Если вы хотите сохранить одно из значений:
firstVariable=$(echo "1.2.14" | awk -F \. {'print $1'})
Небольшая вариация решения fgm с использованием встроенной команды read
для разбиения строки на массив. Обратите внимание, что область действия переменной IFS
ограничена командой read
(поэтому нет необходимости сохранять и восстанавливать текущую переменную IFS
).
version='1.2.33'
IFS='.' read -r -a a <<<"$version"
((a[2]++))
printf '%s\n' "${a[@]}" | nl
version="${a[0]}.${a[1]}.${a[2]}"
echo "$version"