【问题标题】:check two array's exact sequence with grep用 grep 检查两个数组的确切顺序
【发布时间】:2014-04-12 13:59:05
【问题描述】:

我想写一个 bash 脚本来比较两个数组 例如假设:

array1 = ( item1 item2 item3 item4)

array2 = ( item2 item1 item3 item4)

我要检查这个数组,看看 array2 中有多少项恰好在 array1 的同一位置。

在此示例中,item3item4 具有相同的索引。 有没有人可以帮助我如何在 bash 中使用“grep”命令来做到这一点?

【问题讨论】:

  • 您为什么要为此使用grep? (你为什么认为你甚至可以为此使用grep?)

标签: linux bash terminal grep


【解决方案1】:

您可以遍历第一个数组的索引并将它们与第二个数组进行比较以找出相似之处。

您可以使用${!array[@]} 等参数扩展来扩展数组索引列表。

for i in ${!array1[@]}; do
    [[ ${array1[$i]} == ${array2[$i]} ]] && same+=("[$i]=${array1[$i]}")
done
echo "Same indices: ${same[@]}"

【讨论】:

    【解决方案2】:

    如果您坚持使用grep,应该这样做。

    #!/bin/bash
    array1=(item1 item2 item3 item4)
    array2=(item2 item1 item3 item4)
    paste <(for f in "${array1[@]}" ; do echo "$f" ; done) <(for f in "${array2[@]}" ; do echo "$f" ; done) | grep $'^\\([^\t]*\\)\t\\1' | cut -f 1
    

    输出:

    item3
    item4
    

    【讨论】:

      【解决方案3】:

      这不是 grep 的工作。

      i=0
      same=0
      while (( i < ${#array1[@]} && i < ${#array2[@]} )); do
          (( ${array1[i]} == ${array2[i]} && same++ ))
          (( i++ ))
      done
      

      【讨论】:

        【解决方案4】:

        使用 awk 它是一个班轮:

        array1=( item1 item2 item3 item4 )
        array2=( item2 item1 item3 item4 )
        awk 'FNR==NR{a[$1]=NR;next} a[$1]==FNR' <(printf "%s\n" "${array1[@]}") <(printf "%s\n" "${array2[@]}")
        item3
        item4
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-12
          • 2017-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多