2013-03-19 24 views
1

我有一個腳本可以在開始視頻編碼之前檢測作物的值。 我以一定的時間間隔進行幾次探測,比如每隔100幀。 如果所有探測幀的所有作物值都匹配,則沒有問題,並且腳本在編碼函數中啓動。如果裁切值不同,那麼腳本退出並出現錯誤,我需要手動選擇正確的裁切值,這很煩人。Bash:識別數組中的重複字符串

所以,我寧願選擇「最好」的可能值,而不是退出腳本,在這種情況下,這是最重複的數字。

那麼我該如何從最重複的集合中挑選一個字符串呢?

說,我把所有的作物值放在一個數組中。 Crop =('3''4'3''''''''''''''''''''); 所以在這種情況下,我會選擇價值'3',因爲它經常重複。 如何在Bash中以編程方式執行此操作?

謝謝。

- 編輯 -

我道歉,以簡化我的問題我可能會混淆一些你。 真正的作物價值看起來像這樣「720:568:0:4」。

+0

兩種溶液用於'(720工作:568:0:4 100:200:1:10 720:568:0 :4 300:400:100:130)'。 – choroba 2013-03-19 00:39:04

+0

@choroba的確。我剛剛測試... – 2013-03-19 00:46:57

回答

2

使用關聯數組純的bash溶液(bash的版本4需要):

#! /bin/bash 
crop=(3 4 3 5 7 3 7) 
declare -A count 
max=0 
for c in "${crop[@]}" ; do 
    ((count[$c]++)) 
    if ((count[$c] > max)) ; then 
     max=${count[$c]} 
     idx=$c 
    fi 
done 
echo $idx 
+0

爲什麼同時使用'(())'和'let'?讓你的選擇=)'((count [$ c] ++))' – 2013-03-19 00:45:10

+0

@sputnick:有時我也使用'let'和'(())'。對我來說'讓我++'看起來比'((i ++))'好看。 :) – pynexj 2013-03-19 02:01:44

+1

然後你做出引用錯誤,就像在這個答案中通過一個glob。更好(單引號):'let'count [$ c] ++''。 '((count [$ c] ++))'應該是首選的,除非你有使用'let'的特定原因。它通常也表現更好。 – ormaaj 2013-03-19 04:00:52