LoginSignup
19
21

More than 5 years have passed since last update.

awkで重複行を排除する方法

Last updated at Posted at 2017-11-05

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
19
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
21