Eu tenho um arquivo de texto onde guardo as versões:
1.0
2.0
3.0
4.0
5.0
e assim por diante.
Preciso de uma forma de dar, por exemplo, 4.0
como entrada e receber 3.0
como saída. Observe que haveria milhares de versões.
Quer dizer, quero fornecer um número de versão e obter o número da versão anterior. Então, se eu der 9.0
, eu receberei 8.0
.
tentei
sed '1!G;h;$!d' test.txt
Mas isso está imprimindo todos os números.
Responder1
Você poderia fazer isso com bc
(veja oManual do GNU bc). Você pode passar bc
uma expressão aritmética e bc
irá avaliá-la e retornar o resultado, por exemplo
echo '9.0 - 1' | bc -l
Este comando retorna 8.0
como resultado.
Agora suponha que o número da sua versão esteja contido no arquivo version.txt
, por exemplo:
echo '9.0' > version.txt
Então você poderia executar o seguinte comando:
echo "$(cat version.txt) - 1" | bc -l
Isso produziria 8.0
como saída. Alternativamente, suponha que você tenha uma lista de números de versão em um arquivo chamado, versions.txt
por exemplo:
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0
Poderíamos criar um arquivo assim:
for i in {1..10}; do echo "${i}.0" >> versions.txt; done
Neste caso poderíamos usar bc
dentro de um loop while:
while read line; do echo "${line}-1" | bc -l; done < versions.txt
Isso produz a seguinte saída:
0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
Alternativamente, você pode extrair a parte inteira do número da versão e usá-la bash
para realizar a aritmética. Você pode usar inúmeras ferramentas de processamento de texto para fazer isso (por exemplo grep
, sed
, , awk
, etc.). Aqui está um exemplo usando o cut
comando:
echo "$(( $(echo '9.0' | cut -d. -f1) - 1)).0"
Isso produz 8.0
como saída. Colocar isso em um loop while nos dá o seguinte:
while read line; do \
echo "$(( $(echo ${line} | cut -d. -f1) - 1)).0";
done < versions.txt