cómo obtener el número n-1

cómo obtener el número n-1

Tengo un archivo de texto donde guardo versiones:

1.0
2.0
3.0
4.0
5.0

etcétera.

Necesito una forma de dar, por ejemplo, 4.0como entrada y obtener 3.0como salida. Tenga en cuenta que habría miles de versiones.

Quiero decir, quiero dar un número de versión y obtener el número de la versión anterior. Así que si doy 9.0, recibiré 8.0.

Lo intenté

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

Pero esto es imprimir todos los números.

Respuesta1

Puedes hacer esto con bc(ver elmanual de gnu bc). Puede pasar bcuna expresión aritmética y bcevaluarla y devolver el resultado, por ejemplo

echo '9.0 - 1' | bc -l

Este comando regresa 8.0como resultado.

Ahora supongamos que su número de versión está contenido en el archivo version.txt, por ejemplo:

echo '9.0' > version.txt

Entonces podrías ejecutar el siguiente comando:

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

Esto produciría 8.0como resultado. Alternativamente, supongamos que tiene una lista de números de versión en un archivo llamado, versions.txtpor ejemplo:

1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0

Podríamos crear un archivo así:

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

En este caso podríamos usar bcdentro de un bucle while:

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

Esto produce el siguiente resultado:

0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0

Alternativamente, puede extraer la parte entera del número de versión y utilizarla bashpara realizar la aritmética. Puede utilizar cualquier cantidad de herramientas de procesamiento de texto para hacer esto (por ejemplo grep, sed, awk, etc.). Aquí hay un ejemplo usando el cutcomando:

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

Esto produce 8.0como resultado. Poner esto en un bucle while nos da lo siguiente:

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

información relacionada