awkで重複を排除する方法を記載する。
サンプルデータとして、下記のようにAを3回、 Bを2回、Cを1回表示する。
# echo -e "A\nA\nA\nB\nB\nC"
A
A
A
B
B
C
- 重複を排除して表示
# echo -e "A\nA\nA\nB\nB\nC" | awk '!a[$0]++'
または、
# echo -e "A\nA\nA\nB\nB\nC" | awk 'a[$0]++ == 0'
A
B
C
$0は行全体を示すので、A、B、Cがそれぞれ行を読み込む度に代入される。
なので、パイプの右側で下記のような計算が実施されてることになる。
a[A]++
a[B]++
a[C]++
のようになる。
よって、最初にその行が現れたときだけ条件が、インクリメントされる前※なので、配列の値が0となり、条件式 a[$0]++ == 0 と'!a[$0]++'
は真(つまり 1)になる。
アクションが記載されていない場合、awkは真のときだけ、行の内容を表示するので、最初にその行が現れたときだけ、その行が表示される。
※変数の後につけた場合、後置といって、次に変数が参照される際に、インクリメントが行われる。
- 重複行2つ以上あるものだけを表示
# echo -e "A\nA\nA\nB\nB\nC" | awk 'a[$0]++ == 1
A
B
- 重複行が3つ以上あるものだけを表示
# echo -e "A\nA\nA\nB\nB\nC" | awk 'a[$0]++ == 2'
A