シェルスクリプトで配列から重複する要素を削除する方法

目次

スポンサードリンク


シェルスクリプト(bash)では配列変数を定義することができます。 配列の要素の内、重複した要素を削除した伊場合は、trコマンドとsortコマンドを組み合わせて重複を削除します。

配列変数の扱い方

配列の基本的な扱い方は以下の通りです。

# 配列に値をセットする
array[0]="apple"

# 配列の値を参照する
echo ${array[0]}

# 配列を一度に初期化する
array=('orange' 'banana' 'apple')

重複する要素を削除する方法

以下のサンプルコードは配列変数 array1 から、重複する要素を削除した 配列変数 array2 を取得するコードです。

#!/bin/bash

array1=('orange' 'banana' 'orange' 'banana' 'apple')

array2=(`echo "${array1[*]}" | tr ' ' '\n' | sort -u`)

echo "array1 => ${array1[*]}"
echo "array2 => ${array2[*]}"

exit 0

echo “${array1[*]}” で配列 array1 の内容を出力しています。配列の要素全てが半角スペース区切りで出力されるので、 trコマンドで半角スペースを改行に置換しています。その結果を sort コマンドでソートした結果を array2 に代入しています。 sort コマンドの -u(–unique)オプションを指定することで、重複を削除しています。

上記サンプルコードを実行すると以下のように重複を削除できました。

[root@hostname tmp]# ./array_sort.sh
array1 => orange banana orange banana apple
array2 => apple banana orange

ソートをせずに重複する要素を削除する方法

上記サンプルでは、一度ソートしているため要素の順序が変わってしまいます。順序を保持したまま重複を削除したい場合は、awk を利用します。

#!/bin/bash

array1=('orange' 'banana' 'orange' 'banana' 'apple')

array2=(`echo "${array1[*]}" | tr ' ' '\n' | awk '!tmp_array[$0]++{print}'`)

echo "array1 => ${array1[*]}"
echo "array2 => ${array2[*]}"

exit 0

awk の処理では、処理対象の行を $0 として取得しています。 配列 tmp_array には処理対象の行を添字とし、要素が存在しない場合は、! で反転し後続の print 処理が実行されます。2回目の orange を処理する際は、既に初回のインクリメントにより 数値の 1が入っているので、 重複して 処理が実行される事を防いでいます。

実行すると以下のように最初の順序を保ったまま、重複を削除することができました。

[root@hostname tmp]# ./array_sort.sh
array1 => orange banana orange banana apple
array2 => orange banana apple


シェルスクリプトの知識は、プログラマにとって長く役立つ知識です。 私はこちらの書籍で一通り知識を抑えました。基本から丁寧に解説されています。

最短3時間で覚えるLinuxシェルスクリプト
こちらは、シェルスクリプトの基本的な書き方、デバッグ方法、if, case, while, forなど基本的な制御構文について書かれています。30日間の無料体験もできる『Kindle Unlimited』でも読むことができます。

Linuxコマンドについて徹底的に学べるUdemy講座
もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 icon