Comparando valores negativos no bash usando arrays

3

Eu tenho um problema interessante que estou tentando resolver, mas estou ainda incapaz de fazê-lo.

Vamos supor que eu tenha 2 matrizes.

Matriz 1:

1 -2 3 -2 2 -4

Matriz Dois:

-2 -3 4 5 2 -5

Eu quero ser capaz de comparar o i-ésimo valor de ambos Array one e Array two :

  • Se ambos forem negativos, eu entrarei em Array Three 0
  • Se ambos forem positivos, adicionarei um 1
  • Se eles forem opostos, preciso inserir um 2

Saída:

2 0 1 2 1 0 

Como posso fazer isso?

    
por JavaFreak 10.07.2016 / 17:45

2 respostas

6

Se você estiver familiarizado com C, C ++ ou Java, você encontrará essa variante do bash -loop do for bastante familiar. bash faz avaliação aritmética com (( ... )) , então usaremos isso quando compararmos valores:

array1=(  1 -2  3 -2  2 -4 )
array2=( -2 -3  4  5  2 -5 )

array3=( )

for (( i=0; i < ${#array1[@]}; ++i )); do
    if (( array1[i] < 0 && array2[i] < 0 )); then
        array3[$i]=0
    elif (( array1[i] > 0 && array2[i] > 0 )); then
        array3[$i]=1
    else
        array3[$i]=2
    fi
done

echo "${array3[@]}"

Isso também funciona bem com o ksh93 shell, do qual bash obteve muitos de seus recursos.

    
por 10.07.2016 / 18:03
3

Um caminho reto:

arr1=(1 -2 3 -2 2 -4)
arr2=(-2 -3 4 5 2 -5)

i=0

while [[ "$i" -lt "${#arr1[@]}" ]]; do
  a=$(( ${arr1[$i]} * ${arr2[$i]} ))
  if [[ "$a" -lt 0 ]]; then
    echo 2
  else
    if [[ "${arr1[$i]}" -gt 0 ]]; then
      echo 1
    else
      echo 0
    fi
  fi
  : "$((i = i + 1))"
done | paste -sd ' ' -
    
por 10.07.2016 / 18:02

Tags