배열 요소의 합

배열 요소의 합

저는 bash 스크립팅을 배우는 것이 처음이고 이 코드를 작성하는 방법이 혼란스럽습니다.

array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)

이것은 두 개의 배열이고 요소의 합(예: 23+12, 34+13 등)을 가져와야 합니다. 출력은 Result 1: xx배열에 있는 모든 10개 요소의 (합계)여야 합니다. C 스타일 루프를 사용하여 이를 어떻게 코딩할 수 있나요?

답변1

또 다른 옵션은 다음과 같습니다.

#!/bin/bash

array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)

for ((i = 0; i < ${#array1[@]} && i < ${#array2[@]}; i++)); do
    printf "Result %2d: %d\n" $((i + 1)) $((array1[i] + array2[i]))
done

예제를 실행하세요:

Result  1: 35
Result  2: 47
Result  3: 37
Result  4: 55
Result  5: 53
Result  6: 55
Result  7: 44
Result  8: 23
Result  9: 22
Result 10: 43

스크립트는 0부터 시작하여 가장 짧은 배열의 길이까지 루프에서 실행됩니다(향후 일부 변경으로 인해 한 배열이 다른 배열보다 길어지는 경우에 대비). 루프를 통과할 때마다 i번째 항목의 결과를 인쇄합니다.

답변2

어쩌면 이런 게 있지 않을까요?

array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)

# Declare array3 as an array
array3=()

for i in $( seq 1 $((${#array1[@]}+1)) ); do
   array3+=( $(( ${array1[i]} + ${array2[i]} )) );
   printf 'Result %d : %s\n' "$i" "${array3[i]}";
done

산출:

Result 1 : 47
Result 2 : 37
Result 3 : 55
Result 4 : 53
Result 5 : 55
Result 6 : 44
Result 7 : 23
Result 8 : 22
Result 9 : 43

답변3

array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)

set -- "${array1[@]}"

unset counter
for elem in "${array2[@]}"; do
        set -- "$@" "$((++counter))" "$(( $1 + elem ))"
        shift
done

printf 'Result %d: %d\n' "$@"

이는 배열 중 하나(두 번째 요소)의 모든 요소를 ​​반복하며 각 요소에 대해 $elem위치 인수 목록에 카운터와 합계를 추가합니다.

합계는 $elem첫 번째 위치 인수에 추가한 다음 목록에서 제거하여 $1계산 됩니다. 위치 매개변수는 목록의 첫 번째 요소로 초기화되므로 요소가 효과적으로 쌍을 이룹니다.

루프 후 위치 인수에는 합계와 쌍을 이루는 카운터 값이 포함됩니다. 그런 다음 printf.

출력은 다음과 같습니다

Result 1: 35
Result 2: 47
Result 3: 37
Result 4: 55
Result 5: 53
Result 6: 55
Result 7: 44
Result 8: 23
Result 9: 22
Result 10: 43

물론 루프에서 직접 결과를 인쇄할 수도 있습니다.

array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)

set -- "${array1[@]}"

unset counter
for elem in "${array2[@]}"; do
        printf 'Result %d: %d\n' "$((++counter))" "$(( $1 + elem ))"
        shift
done

C 스타일 while루프를 사용하십시오.

array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)

set -- "${array1[@]}"

unset counter
while [ "$#" -ne 0 ]; do
        printf 'Result %d: %d\n' "$((++counter))" "$(( $1 + array2[counter-1] ))"
        shift
done

순수 sh변형:

set -- 23 34 23 12 11 32 12 12 12 21

unset counter
for elem in 12 13 14 43 42 23 32 11 10 22; do
        printf 'Result %d: %d\n' "$((counter += 1))" "$(( $1 + elem ))"
        shift
done

사용 bcpaste:

array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)

paste -d '+' \
        <( printf 'print "Result ", ++c, ": ", %s\n' "${array1[@]}" ) \
        <( printf '%s, "\\n"\n' "${array2[@]}" ) |
bc

사용 awk(C 스타일 for루프와 함께!):

array1=(23 34 23 12 11 32 12 12 12 21)
array2=(12 13 14 43 42 23 32 11 10 22)

awk     -v a="${array1[*]}" \
        -v b="${array2[*]}" \
        '
BEGIN {
        split(a,aa," ");
        n = split(b,bb," ");

        for (i = 1; i <= n; ++i)
                printf "Result %d: %d\n", i, aa[i]+bb[i]
}'

답변4

dc의 재미를 위해
죄송합니다. 리뷰는 프랑스어로 되어 있습니다.

#!/bin/bash
array1=(23 34 23 12 3211 32 12 2 12 21)
array2=(12 13 14 43 42 23 32 5 710 22)
dc <<EOF
# Definition
  # macro e = quitter si les tableaux n ont pas la meme taille
  # macro f = calcul du nb de digit du resultat et stocke le max dans registre p
  # macro g = addition des tableaux dans le registre tableau m
  # macro h = afficher les espaces pour le formattage
  # macro i = affichage du resultat formatte 
  # registre j = nb elt tableau
  # registre k = nb max de digit de l index du tableau
  # registre l = compteur elt tableau
  # registre m = tableau indexe de la somme des tableaux d entree
  # registre n = compteur du nb de digit de l index du tableau
  # registre o = nb max de digit pour affichage
  # registre p = nb max de digit du calcul
  # registre q = poubelle
# Strings
  [arrays are not the same size]sa
  [Result]sb
  [:]sc
  [ ]sd
# Macros
  [lapq]se
  [dZsp]sf
  [ll;m+dZlp<fll:mll1-dsl0<g]sg
  [lnd1+snldnlo>h]sh
  [ll1+dddsllbndZsnlksolhxnlcn;mdZsnlpsolhxpsqlj>i]si
# Program
  $(printf "%d\n" ${array1[*]})
  zdsjZsk
  $(printf "%d\n" ${array2[*]})
  zlj-lj!=e
  ljsllgxljsllgx
  lix
EOF

전시하다:

Result  1:   35  
Result  2:   47  
Result  3:   37  
Result  4:   55  
Result  5: 3253  
Result  6:   55  
Result  7:   44  
Result  8:    7  
Result  9:  722  
Result 10:   43  

관련 정보