wie man die Zahl n-1 erhält

wie man die Zahl n-1 erhält

Ich habe eine Textdatei, in der ich Versionen speichere:

1.0
2.0
3.0
4.0
5.0

und so weiter.

Ich brauche beispielsweise eine Möglichkeit, 4.0als Eingabe Folgendes anzugeben und 3.0als Ausgabe abzurufen. Beachten Sie, dass es Tausende von Versionen geben würde.

Ich meine, ich möchte eine Versionsnummer angeben und die Nummer der vorherigen Version erhalten. Wenn ich also eingebe 9.0, erhalte ich 8.0.

Ich habe es versucht

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

Aber hier werden alle Zahlen gedruckt.

Antwort1

Sie können dies tun mit bc(sieheGNU BC-Handbuch). Sie können bceinen arithmetischen Ausdruck übergeben und bcdieser wird ausgewertet und das Ergebnis zurückgegeben, z. B.

echo '9.0 - 1' | bc -l

Dieser Befehl gibt 8.0als Ergebnis zurück.

Nehmen wir nun an, dass Ihre Versionsnummer in der Datei enthalten ist version.txt, zum Beispiel:

echo '9.0' > version.txt

Anschließend könnten Sie den folgenden Befehl ausführen:

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

Als Ausgabe würde dies erscheinen 8.0. Alternativ können Sie auch annehmen, dass Sie eine Liste von Versionsnummern in einer Datei mit versions.txtdem Namen haben:

1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0

Wir könnten eine solche Datei wie folgt erstellen:

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

In diesem Fall könnten wir Folgendes bcinnerhalb einer While-Schleife verwenden:

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

Dies erzeugt die folgende Ausgabe:

0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0

Alternativ können Sie den ganzzahligen Teil aus der Versionsnummer extrahieren und bashfür die Berechnung verwenden. Sie können hierfür eine beliebige Anzahl von Textverarbeitungsprogrammen verwenden (z. B. grep, sed, awk, usw.). Hier ist ein Beispiel mit dem folgenden cutBefehl:

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

Als Ausgabe wird Folgendes ausgegeben 8.0. Wenn wir dies in eine While-Schleife einfügen, erhalten wir Folgendes:

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

verwandte Informationen