Arrays 在多个数组上删除Bash字符串

Arrays 在多个数组上删除Bash字符串,arrays,string,bash,Arrays,String,Bash,我的bash中有两个数组,每个数组都包含文件。在我的循环中,有时文件会被删除。每当发生这种情况时,一个数组显示旧状态,另一个数组显示新状态。我怎样才能表现出它们之间的差异,例如。G哪个文件被删除了?顺便说一下,没有其他方法可以找到答案 下面是一个例子: arr_a=( file1.txt file2.txt file3.txt ) arr_b=( file1.txt file3.txt ) #Now the output should be file2.txt 我想象了一些小的东西,但是这不

我的bash中有两个数组,每个数组都包含文件。在我的循环中,有时文件会被删除。每当发生这种情况时,一个数组显示旧状态,另一个数组显示新状态。我怎样才能表现出它们之间的差异,例如。G哪个文件被删除了?顺便说一下,没有其他方法可以找到答案

下面是一个例子:

arr_a=( file1.txt file2.txt file3.txt )
arr_b=( file1.txt file3.txt )

#Now the output should be file2.txt

我想象了一些小的东西,但是这不起作用。(这会导致arr_a被完全输出。)

这一个有点复杂,但在阵列不保持相关性的情况下可以工作。它对较大数组中的所有元素进行排序,以与较短数组中的元素相关联,然后打印较大数组中的其余元素(它处理数组的副本)。未完全测试:

#!/bin/bash
arr_a=( file1.txt file2.txt file3.txt )
arr_b=( file1.txt file3.txt )

sortarr() {
    local sorted=( ${!1} ) sortby=( ${!2} )
    local length=${#sorted[@]} i=${#sortby} matches
    while (( i-- )); do
        [[ ! "${sorted[@]}" =~ ${sortby[$i]} ]] && continue
        sorted=( ${sorted[@]//$BASH_REMATCH/} )
        printf -v matches '%*s' $(( $length - ${#sorted[@]} ))
        sorted=( ${matches// /$BASH_REMATCH }${sorted[@]} )
    done
    for (( i=${#sortby[@]}; i<${#sorted[@]}; i++ )); do
        echo ${sorted[$i]}
    done
}

if (( ${#arr_a[@]} > ${#arr_b[@]} )); then
    sortarr arr_a[@] arr_b[@]
else
    sortarr arr_b[@] arr_a[@]
fi
#/bin/bash
arr_a=(file1.txt file2.txt file3.txt)
arr_b=(file1.txt file3.txt)
索塔尔{
局部排序=(${!1})排序比=(${!2})
本地长度=${排序[@]}i=${排序比}匹配
当((我…);做
[[!“${sorted[@]}”=~${sortby[$i]}]]]&继续(&C)
排序=(${sorted[@]/$BASH_REMATCH/})
printf-v匹配“%*s”$($length-${#排序[@]}))
排序=(${matches///$BASH_REMATCH}${sorted[@]})
完成
对于((i=${#sortby[@]};i${#arr#b[@]})),那么
SORTAR arr__a[@]arr_b[@]
其他的
sortarr arr_b[@]arr_a[@]
fi

@David:您基本上需要的是两个集合之间的差异。使用一点python可以更轻松地做到这一点,如下面的方法0所示。方法1和2只是使用Bash索引和稀疏数组的两个变体。以下每个方法的输出都是
file2.txt

方法-0:

#!/bin/bash

arr_a=( file1.txt file2.txt file3.txt )
arr_b=( file1.txt file3.txt )

echo -e "${arr_a[@]} \n ${arr_b[@]}" | python -c '\
    a=set(raw_input().strip().split());\
    b=set(raw_input().strip().split());\
    (x,y)=(a,b) if len(a)>len(b) else (b,a);\
    print "".join(list(x-y));'
#!/bin/bash

arr_a=( file1.txt file2.txt file3.txt )
arr_b=( file1.txt file3.txt )
i=0

for a in ${arr_a[@]}
do
    AinB=0
    for b in ${arr_b[@]}
    do
        if [[ $a == $b ]]
        then
            AinB=1
        fi
    done

    if [[ AinB -eq 0 ]]
    then
        arr_c[$((i++))]=$a
    fi
done

echo ${arr_c[@]}
#!/bin/bash

arr_a="file1.txt file2.txt file3.txt"
arr_b="file1.txt file3.txt"
arr_c=""

for a in $arr_a
do
    isPresentInB=0
    for b in $arr_b
    do
        if [[ $a == $b ]]
        then
            isPresentInB=1
            break
        fi
    done

    if [[ $isPresentInB -eq 0 ]]
    then
        arr_c="$arr_c $a"
    fi
done

echo $arr_c
方法1:

#!/bin/bash

arr_a=( file1.txt file2.txt file3.txt )
arr_b=( file1.txt file3.txt )

echo -e "${arr_a[@]} \n ${arr_b[@]}" | python -c '\
    a=set(raw_input().strip().split());\
    b=set(raw_input().strip().split());\
    (x,y)=(a,b) if len(a)>len(b) else (b,a);\
    print "".join(list(x-y));'
#!/bin/bash

arr_a=( file1.txt file2.txt file3.txt )
arr_b=( file1.txt file3.txt )
i=0

for a in ${arr_a[@]}
do
    AinB=0
    for b in ${arr_b[@]}
    do
        if [[ $a == $b ]]
        then
            AinB=1
        fi
    done

    if [[ AinB -eq 0 ]]
    then
        arr_c[$((i++))]=$a
    fi
done

echo ${arr_c[@]}
#!/bin/bash

arr_a="file1.txt file2.txt file3.txt"
arr_b="file1.txt file3.txt"
arr_c=""

for a in $arr_a
do
    isPresentInB=0
    for b in $arr_b
    do
        if [[ $a == $b ]]
        then
            isPresentInB=1
            break
        fi
    done

    if [[ $isPresentInB -eq 0 ]]
    then
        arr_c="$arr_c $a"
    fi
done

echo $arr_c
方法2:

#!/bin/bash

arr_a=( file1.txt file2.txt file3.txt )
arr_b=( file1.txt file3.txt )

echo -e "${arr_a[@]} \n ${arr_b[@]}" | python -c '\
    a=set(raw_input().strip().split());\
    b=set(raw_input().strip().split());\
    (x,y)=(a,b) if len(a)>len(b) else (b,a);\
    print "".join(list(x-y));'
#!/bin/bash

arr_a=( file1.txt file2.txt file3.txt )
arr_b=( file1.txt file3.txt )
i=0

for a in ${arr_a[@]}
do
    AinB=0
    for b in ${arr_b[@]}
    do
        if [[ $a == $b ]]
        then
            AinB=1
        fi
    done

    if [[ AinB -eq 0 ]]
    then
        arr_c[$((i++))]=$a
    fi
done

echo ${arr_c[@]}
#!/bin/bash

arr_a="file1.txt file2.txt file3.txt"
arr_b="file1.txt file3.txt"
arr_c=""

for a in $arr_a
do
    isPresentInB=0
    for b in $arr_b
    do
        if [[ $a == $b ]]
        then
            isPresentInB=1
            break
        fi
    done

    if [[ $isPresentInB -eq 0 ]]
    then
        arr_c="$arr_c $a"
    fi
done

echo $arr_c

这可能适合您:

arr_a=(file1.txt file2.txt file3.txt)
arr_b=(file1.txt file3.txt)
answer=$(comm -3 <(printf "%s\n" "${arr_a[@]}") <(printf "%s\n" "${arr_b[@]}")
echo "$answer"
file2.txt
arr_a=(file1.txt file2.txt file3.txt)
arr_b=(file1.txt file3.txt)

答案=$(comm-3数组总是在同一序列中,只删除元素,还是也可以添加元素?我想你可能必须在这一个上使用嵌套for循环。不添加,只删除,就像在示例中一样。非常感谢。我将根据我的需要进一步修改。再次感谢