【问题标题】:Compare adjacent values in Unix array比较 Unix 数组中的相邻值
【发布时间】:2016-04-27 21:50:58
【问题描述】:

我有一个像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'

-谢谢

【问题讨论】:

  • 欢迎来到 StackOverflow!我们很乐意在这里提供帮助,但我们不是代码编写服务。向我们展示您迄今为止尝试过的一些 sn-ps,我们将帮助您弄清楚如何使其发挥作用。
  • 你还能显示示例输入和输出吗?

标签: arrays shell unix


【解决方案1】:

该错误是预期的。您正在超出数组大小。您的循环使用数组的长度为 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 等。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多