У меня есть текстовый файл, в котором я храню версии:
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