как получить число n-1

как получить число n-1

У меня есть текстовый файл, в котором я храню версии:

1.0
2.0
3.0
4.0
5.0

и так далее.

Мне нужен способ дать, например, 4.0как вход и получить 3.0как выход. Обратите внимание, что будут тысячи версий.

Я имею в виду, что я хочу дать номер версии и получить номер предыдущей версии. Так что если я дам 9.0, я получу 8.0.

Я пытался

  sed '1!G;h;$!d' test.txt 

Но это печать всех цифр.

решение1

Вы можете сделать это с помощью bc(см.руководство GNU bc). Вы можете передать bcарифметическое выражение, которое bcоценит его и вернет результат, например

echo '9.0 - 1' | bc -l

Эта команда возвращает 8.0результат.

Теперь предположим, что номер вашей версии содержится в файле version.txt, например:

echo '9.0' > version.txt

Затем вы можете выполнить следующую команду:

echo "$(cat version.txt) - 1" | bc -l

Это произведет 8.0в качестве своего вывода. В качестве альтернативы предположим, что у вас есть список номеров версий в файле с именем, versions.txtнапример:

1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0

Мы могли бы создать такой файл следующим образом:

for i in {1..10}; do echo "${i}.0" >> versions.txt; done

В этом случае мы могли бы использовать bcвнутри цикла while:

while read line; do echo "${line}-1" | bc -l; done < versions.txt

Это дает следующий результат:

0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0

В качестве альтернативы вы можете извлечь целую часть из номера версии и использовать bashдля выполнения арифметических действий. Для этого вы можете использовать любое количество инструментов обработки текста (например grep, sed, , awk, и т. д.). Вот пример использования cutкоманды:

echo "$(( $(echo '9.0' | cut -d. -f1) - 1)).0"

Это производит 8.0как его выход. Помещая это в цикл while, мы получаем следующее:

while read line; do \
    echo "$(( $(echo ${line} | cut -d. -f1) - 1)).0";
done < versions.txt

Связанный контент