2017-12-11 4 views
-2

Ich echote einige Daten aus einem Oracle DB-Cluster über ein Bash-Skript. Derzeit meine Ausgabe in eine Variable im Skript von SQLPlus ist:BASH-Skript - Überprüfen Sie, ob fortlaufende Zahlen in einer Zeichenfolge über einem Wert liegen

11/12 0 0 0 0 0 0 1 0 1 0 5 4 1 0 0 0 0 0 0 0 0 0 0 0 

Was ich in der Lage sein möchte, zu tun, ist, dass die Reihe von Zahlen zu bewerten, mit Ausnahme des ersten (das Datum), um zu sehen, ob alle aufeinander folgenden 6 der Zahlen sind über einem bestimmten Wert, sagen wir 10.

Ich möchte nur die Logik True, wenn alle 6 aufeinander folgenden Werte über "10" waren.

So zum Beispiel, wenn der Ausgang ist:

11/12 0 0 8 10 5 1 1 0 8 10 25 40 6 2 0 0 0 0 0 0 0 0 0 0 

Die Logik falsch/null/null, etwas zurückgeben soll, kann ich negativ behandeln.

Aber wenn die Zeichenfolge wie folgt aussehen:

11/12 0 0 0 0 5 9 1 0 1 10 28 10 12 19 15 11 6 7 0 0 0 0 

Dann wäre es wahr/1 etc .. Rückkehr

Gibt es eine Bash-Komponente, die ich Verwendung, dies zu tun zu machen? Ich bin seit einer Weile auf diesem Teil festgefahren.

+0

Diese helfen könnte. [Link] (https://stackoverflow.com/questions/10586153/split-string-into-an-array-in-bash) – TurtlesAllTheWayDown

Antwort

2

Für Abwechslung ist hier eine Lösung nicht abhängig von awk:

#!/usr/bin/env bash 

contains() { 
    local nums=$* count=0 threshold=10 limit=6 i 
    for i in ${nums#* }; do 
     if ((i >= threshold)); then 
     ((++count >= limit)) && return 0 
     else 
     count=0 
     fi 
    done 
    return 1 
} 

output="11/12 0 0 0 0 5 9 1 0 1 10 28 10 12 19 15 11 6 7 0 0 0 0" 
if contains "$output"; then 
    echo "Yaaay!" 
else 
    echo "Noooo!" 
fi 
+1

Ich mag dies, +1. Ich sollte definitiv ein bisschen mehr Bash lernen :-) – Ronald

+0

Dieser macht mehr Sinn in meinem Kopf (mit meinem begrenzten Bash-Wissen) +1 und Antwort markiert. Vielen Dank. –

2

Sagen Sie Ihre Zeichenfolge in $ S ist, dann

echo $S | awk ' 
    { L=0; threshold = 10; reqLength = 6; 
     for (i = 2; i <= NF; ++i) { 
      if ($i >= threshold) { 
       L += 1 
       if (L >= reqLength) { 
        exit(1); 
       } 
      } else { 
       L = 0 
      } 
     } 
    }' 

würde es tun. (? $ Wird 1 sein, wenn Sie genug Zahlen haben mehr als Ihre Schwelle)

+1

Es sollte sein: "i <= NF" und auch "L> = regLength". – PesaThe

+0

Schön. Sie müssen den Schwellenwert und die reqLength nicht für jede Zeile definieren. Ich würde diese Werte wie folgt übergeben: 'awk -v Schwelle = 10 -v reqLength = 6 '{L = 0; für ... ' –

+0

@PesaDie Danke! Vor allem das "i <= NF" ist entscheidend. Ich habe meine Antwort bearbeitet und beide Vorschläge verwendet – Ronald

Verwandte Themen