BioErrorLog Tech Blog

試行錯誤の記録

コマンドで重複行を排除して一度だけ表示する

awkで簡単にできます:

awk '!seen[$0]++'

はじめに

コマンドで重複行を排除して一度だけ表示する方法の備忘録を残します。

The English translation of this post is here.

コマンドで重複行を排除して一度だけ表示する

下記コマンドで、重複行を排除して一度だけ表示可能です:

awk '!seen[$0]++'

コマンド解説

awk '!seen[$0]++'
  • $0: 現在処理している行全体
  • seen[$0]: "現在処理している行全体"をキーとする連想配列"seen"の値
  • seen[$0]++: "現在処理している行全体"をキーとする連想配列"seen"の値をインクリメント
    • その行が初めて出てきた場合: 未定義 → 0
    • その行が既にカウントされている場合: 値が1増加
  • !seen[$0]++: NOT演算子付きでbool判定
    • その行が初めて出てきた場合: !0 = true
    • その行が既にカウントされている場合: !1(以上) = false
  • awk '!seen[$0]++': その行が初めて出てきた場合のみtrueとなり表示

よって、このコマンドで重複行を排除して一度だけ表示することができます。

実行例

下記のようなファイルlist.txtの内容を、先ほどのコマンドで重複行を排除して表示してみます。

apple
banana
apple
orange
banana
grape
apple


実行コマンド:

cat list.txt | awk '!seen[$0]++'

出力結果:

apple
banana
orange
grape

このように、重複行を排除して一度だけ表示されることが確認できました。

おわりに

以上、コマンドで重複行を排除して一度だけ表示する方法のメモでした。

どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

参考