2017-06-16 3 views
0

Ich versuche, ein Skript zu schreiben, die die folgenden:grep zwei ganzen Zahlen und vergleichen sie

  1. einen String gegeben, die wie folgt aussehen: „Es gibt 5 Äpfel und 3 Orangen“
  2. die beiden ganzen Zahlen Extract (5, 3)
  3. Vergleichen sie

ich habe den Extrakt Teil getan.

NUM=echo $String | grep -o "[0-9]\+" 

Aber NUM wird so etwas wie dieses:

5 
3 
\n 

Ich versuchte ${NUM[0]} und ${NUM[@]} nur den ersten Wert zu erhalten, aber es funktioniert nicht.

Irgendwelche Vorschläge?

+0

Bitte nehmen Sie sich einen Blick auf: [? Was soll ich tun, wenn jemand meine Frage beantwortet] (http://stackoverflow.com/help/someone-answers) – Cyrus

Antwort

0

Die Zuordnung zu NUM ist falsch. So ist das grep Muster in Ihrem Beitrag. schreiben wie folgt aus:

input='There are 5 apples and 3 oranges' 
nums=($(grep -Eo '[0-9]+' <<< "$input")) 

${nums[0]} wird die erste Nummer enthalten, ${nums[1]} die zweite und so weiter.

Wenn die Eingabe von einem Befehl kommt:

nums=($(cmd | grep -Eo '[0-9]+')) 
+0

Was ist, wenn die Zeichenfolge eine Variable oder ein Befehl ist? –

+0

@AlbertYip Ich aktualisierte meine Antwort mit Beispielen für diese Fälle. – janos

0

Ich würde diese Substitution mit Prozess tun und mapfile:

$ mapfile -t nums < <(grep -Eo '[[:digit:]]+' <<< 'There are 5 apples and 3 oranges') 
$ declare -p nums 
declare -a nums='([0]="5" [1]="3")' 

Dies stellt sicher, dass nur einzelne Array-Elemente Zeilenumbrüche. Dies wäre in diesem Fall kein Problem, da es sich bei den Suchbegriffen um Folgen von Zahlen handelt, aber es ist ein robuster Ansatz, der für jedes Muster funktioniert.

Beachten Sie, dass mapfile Bash 4.0 oder neuer erfordert.

0

mit GNU awk:

gawk '{if($1>$2){print $1">"$2}else if($1<$2){print $1"<"$2} else {print $1"="$2}}' FPAT='[0-9]+' <<<'There are 5 apples and 8 oranges' 

Der Wert FPAT sollte ein String sein, die einen regelmäßigen Ausdruck bietet. Dieser reguläre Ausdruck beschreibt den Inhalt jedes Felds .

+1

Ja, richtig, vielen Dank. – tso

0

Mit GNU awk für FPAT:

$ echo 'There are 5 apples and 3 oranges' | 
    awk -v FPAT='[0-9]+' '{print ($1 > $2 ? "greater" : "lesser")}' 
greater 
$ echo 'There are 2 apples and 3 oranges' | 
    awk -v FPAT='[0-9]+' '{print ($1 > $2 ? "greater" : "lesser")}' 
lesser 
Verwandte Themen