Bash Array Comparision

2

Dentro de um script bash, estou construindo dois arrays dinâmicos. E eu quero construir outro array com diferença de dois.

Exemplo:

array1=("aa-1234|safsf|sfsfs" "aa-2345|sfsfs|n0sfm" "aa-0890|ssfsf|sfss" "aa-8097|fsfsf|fsfs" "bb-1234|xvxx|xvxv" "cc-1234|jmsf|sfsfs" "cc-1235|xvxv|xvxv")
array2=(aa-1234 aa-8097)
Os elementos

array1 são entradas longas com | como um delimitador em cada.

Agora eu quero construir um array3, cujos elementos são todos de array1, exceto aqueles correspondentes em array2.

Eu tentei um loop for para pular os elementos. No entanto array1 sendo um longo, é muito tempo. Estou procurando uma maneira mais eficiente.

    
por sudobash 20.11.2014 / 20:08

1 resposta

2

Eu criaria uma expressão regular a partir da segunda matriz e, em seguida, compararia os elementos da primeira matriz com ela:

$ re=$(IFS='|'; echo "^(${array2[*]})\|")
$ echo "$re"
^(aa-1234|aa-8097)\|
$ for elem in "${array1[@]}"; do if [[ $elem =~ $re ]]; then array3+=("$elem"); fi; done
$ printf "%s\n" "${array3[@]}"
aa-1234|safsf|sfsfs
aa-8097|fsfsf|fsfs

Se os arrays forem muito maiores do que os mostrados, eu geraria o exercício para grep

$ grep -Ff <(printf "%s\n" "${array2[@]}") <(printf "%s\n" "${array1[@]}")
aa-1234|safsf|sfsfs
aa-8097|fsfsf|fsfs
    
por 20.11.2014 / 20:58

Tags