como obter o número n-1

como obter o número n-1

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.0como entrada e receber 3.0como 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 bcuma expressão aritmética e bcirá avaliá-la e retornar o resultado, por exemplo

echo '9.0 - 1' | bc -l

Este comando retorna 8.0como 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.0como saída. Alternativamente, suponha que você tenha uma lista de números de versão em um arquivo chamado, versions.txtpor 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 bcdentro 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 bashpara 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 cutcomando:

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

Isso produz 8.0como 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

informação relacionada