2017-06-16 68 views
0

我想編寫一個腳本,執行以下操作:grep的兩個整數,並比較他們

  1. 給定一個字符串,它看起來像這樣「有5個蘋果,3個橘子」
  2. 提取兩個整數(5,3)
  3. 比較他們

我所做的提取部分。

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

但NUM將是這樣的:

5 
3 
\n 

我試圖${NUM[0]}${NUM[@]}剛剛拿到的第一個值,但它不工作。

有什麼建議嗎?

+0

請看一看:?當有人回答我的問題,我應該怎麼辦(http://stackoverflow.com/help/someone-answers ) – Cyrus

回答

0

您分配給NUM的方式不正確。 你的帖子中的grep模式也是如此。 這樣寫:

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

${nums[0]}將包含第一個數字,${nums[1]}第2,依此類推。

如果輸入來自一個命令:

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

如果字符串是變量或命令怎麼辦? –

+0

@AlbertYip我用這些案例的例子更新了我的答案。 – janos

0

我將與進程替換和mapfile做到這一點:

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

這可以確保只有換行符單獨的數組元素。在這種情況下,這不會成爲問題,因爲搜索條件是數字序列,但它是一種適用於任何模式的穩健方法。

請注意,mapfile需要Bash 4.0或更高版本。

0

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' 

FPAT的值應該是,提供了一個正則表達式 一個字符串。這個正則表達式描述了每個 字段的內容。

+1

對,非常感謝。 – tso

0

隨着GNU AWK爲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