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.0
como entrada y obtener 3.0
como 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 bc
una expresión aritmética y bc
evaluarla y devolver el resultado, por ejemplo
echo '9.0 - 1' | bc -l
Este comando regresa 8.0
como 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.0
como resultado. Alternativamente, supongamos que tiene una lista de números de versión en un archivo llamado, versions.txt
por 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 bc
dentro 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 bash
para 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 cut
comando:
echo "$(( $(echo '9.0' | cut -d. -f1) - 1)).0"
Esto produce 8.0
como 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