簡體   English   中英

比較 Unix 數組中的相鄰值

[英]Compare adjacent values in Unix array

我有一個像a=( 1 3 2 34 5)這樣的數組

我想比較彼此相鄰的值(比較 1 與 3、3 與 2、2 與 34,等等)。

如果它們相同,則打印消息 1,否則打印消息 2。

a=( 1 1 2 34 5)
len=${#a[@]}
for  i in `seq 0 $len`
do
if [ ${a[i]} -eq ${a[i+1]} ]; then

echo "values are same"
else
echo "values are different"
fi

完畢

比較值 34 和 5 后,拋出錯誤。

+ '[' 34 -eq 5 ']'
+ echo 'values are different'
 values are different
+ for i in '`seq 0 $len`'
 + '[' 5 -eq ']'
 b.sh: line 27: [: 5: unary operator expected
+ echo 'values are different'

-謝謝

錯誤是預料之中的。 您正在超出數組大小。 您的循環使用數組的長度為 5,然后您繼續將最后一個元素與不存在的下一個元素進行比較。 您應該停止比較小於大小。 考慮以下示例:

#!/bin/bash

array=(1 1 2 34 5)

for ((index=0; index < ${#array[@]} - 1; index++)); do
    echo "--> ${array[index]} | ${array[index + 1]} <--"
    if [[ ${array[index]} -eq ${array[index + 1]} ]]; then
        echo "values are same"
    else
        echo "values are different"
    fi
done

輸出:

--> 1 | 1 <--
values are same
--> 1 | 2 <--
values are different
--> 2 | 34 <--
values are different
--> 34 | 5 <--
values are different

您的腳本有一些改進。 使用[[而不是[ 避免不必要地使用seq等。

Debian 的num-utils包包含 util numinterval ,它比較來自STDIN 的相鄰值。 這是一些代碼:

printf "%s\n" ${a[*]}  | numinterval | sed -n 's/0/same/p;t;s/.*/different/p'

工作原理: printf在陣列中的每個值${a[*]}在不同的行,管numinterval ,然后sed哪個打印“相同的”,如果數字是“0”,或“不同的”如果沒有。

輸出:

same
different
different
different

可以清除相同的代碼以生成快速比較圖表,(讀起來像三角形,左邊的長邊):

paste <(printf "%s\n" ${a[*]}) \
      <(printf "%s\n" ${a[*]} | numinterval) \
      <(printf "%s\n" ${a[*]} | numinterval | 
        sed -n 's/0/same/p;t;s/.*/different/p')

...輸出:

1   0   same
1   1   different
2   32  different
34  -29 different
5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM