比较数组元素,如果没有则添加

时间:2013-11-18 12:56:42

标签: arrays bash compare

我有一个包含两种类型图片的目录。以年份(e.q,20131118SPECIFICNUMBER)开头的照片名称以及以swSPECIFICNUMBER开头的草稿名称。

我想首先让ls sw *进入Array:

    i=0
while read line
do
    array1[ $i ]="$line"        
    (( i++ ))
done < <(ls sw*)

然后我想在阵列中获得20 * *:

j=0
    while read line
    do
        array2[ $j ]="$line"        
        (( j++ ))
    done < <(ls 20*)

最后一步是比较两个Arrays并将array2中的sw草图添加到array1中,但是已经有一个具有可比较特定数字的图像我不想添加sw草稿。

示例:

Array1 [20131118ABC123,20131118DEF456) Array2 [swABC123,swGHI789]

应该将swGHI789添加到array1但不添加到swABC123,因为已经存在具有可比较特定数字的图像

我有了第一个想法,但这实际上不是我需要的:(请帮忙

for t in "${Array2[@]}"; do
     skip=
     for q not in "${Array1[@]}"; do
        [[ $t == $q ]] && { skip=1; break; }
     done
     [[ -n $skip ]] || Array1+=("$t")
 done

1 个答案:

答案 0 :(得分:0)

对于高于4.0的版本,您可以使用bash关联数组(我不确定bash版本是否支持此功能)。

#!/bin/bash

# preparing the two arrays
array1=($(ls -1 20*))
array2=($(ls -1 sw*))

# create a dictionary
# key is specific number
# value is an integer greater than 0
value=1
declare -A dict  # declare an associated array
for elem in ${array1[@]}; do
    key=${elem:8}  # pick the specific number after date
    dict[$key]=$value
    value=$((value+1))
done

i=${#array1[@]}
for elem in ${array2[@]}; do
    key=${elem:2}  # pick the specific number after "sw"
    if [ -z "${dict[$key]}" ]; then
        array1[i]=$elem
        i=$((i+1))
    fi
done

希望它有所帮助。