配列に重複した値があるかどうかをテストする

配列に重複した値があるかどうかをテストする

配列で重複した値をテストする簡単な方法を見つけようとしています。重複項目がある特定の行を識別できることは良いですが、必須ではありませんが、重複項目があるかどうかを確認できることが重要です。

いくつかの数字を含む配列があります$key_array

# echo ${key_array[@]}
1 2 3 4 3 3

配列には複数の数字を含めることができ、その一部は他の数字と重複する可能性があります。それらは単なる整数です。 (0たとえば、aで始まる数字は配列にまったく入ってはいけませんが、そのよう03な場合は、異なる数字として扱うよりもキャプチャして、重複したものとして扱うことをお勧めします。)303

この番号が重複していることを確認する必要があります。他の方法がなければ、終了コードを使用してこれを行うことができるようです。私が望むのはこれです:

if $(some command); then
 echo "Array contains duplicates."
 exit 1
fi
$(commands to run after duplicate check)

最終的なアイデアは、重複がある場合、スクリプトがユーザーに通知して終了することです(重複がどこにあるかを識別することはそれほど重要ではなく、ユーザーに重複を確認するように指示するだけで十分です)。継続的に実行され、他の多くのタスクも実行されます。

どうすればこれを行うことができますか?

ベストアンサー1

zshシェルから:

array=(1 2 3 4 3 3)
if (($#array != ${#${(u)array}})); then
  print -u2 array contains duplicates
  exit 1
fi

ここでは${(u)array}配列の固有要素に拡張されるので、要素数と固有要素数を比較するだけです。

シェルにはbashそれに対応するものはありませんが、配列にはNULバイトを含めることができないため、GNUシステムを使用している場合は次のことができます。

readarray -td '' dups < <(
  (( ${#array[@]} == 0 )) ||
    printf '%s\0' "${array[@]}" |
      LC_ALL=C sort -z |
      LC_ALL=C uniq -zd
)

if ((${#dups[@]} > 0)); then
  echo >&2 "array has duplicates:"
  printf >&2 ' - "%s"\n' "${dups[@]}"
  exit 1
fi

要素が考慮される場所コピーバイト単位で同じ場合、数値(存在する場合)が同じ場合ではありません(、、、、、、、、すべて1が異なる01と見なされます)。0x11e02-1$'1\n'' 1'

おすすめ記事