Bash Scripting

Bashで重複行を効率的に削除する

Spread the love

テキストファイルから重複行を削除することは、Bashスクリプトにおける一般的なタスクです。この記事では、sortuniqを使用する方法、そしてawkを活用する方法という2つの効率的な方法を解説します。

目次

sortuniqを使う

このアプローチは、2つの基本的なUnixユーティリティを組み合わせて、簡単な解決策を提供します。sortは行をアルファベット順に並べ替え、uniqの前提条件となります。uniqはその後、連続する重複行を削除します。各行の最初の出現順序は保持されます。

コマンドは次のとおりです。


sort file.txt | uniq > file_unique.txt

これは、file.txtのソートされた出力をuniqにパイプし、一意の行をfile_unique.txtに保存します。元のファイルは変更されません。

例:

file.txtに次の内容が含まれている場合:


apple
banana
apple
orange
banana
grape

file_unique.txtには次の内容が含まれます。


apple
banana
grape
orange

awkコマンドを使う

awkは、特に元の行の順序を維持することが重要な場合に、より柔軟で強力なソリューションを提供します。これは、出会った行を追跡するために連想配列を使用します。

コマンドは非常に簡潔です。


awk '!seen[$0]++' file.txt > file_unique.txt

分解してみましょう。

  • $0は、現在の行全体を表します。
  • seen[$0]は、行をキーとして使用して、seen配列の要素にアクセスします。
  • ++は値(最初は0)をポストインクリメントします。
  • !は結果を否定します。行は、初めて出会った場合(seen[$0]が0の場合)のみ出力されます。

この方法は、元の行の順序を維持します。

例:

同じfile.txtを使用すると、file_unique.txtの出力は次のようになります。


apple
banana
orange
grape

結論:

どちらの方法も、重複行を効果的に削除します。sort | uniqは基本的なシナリオではシンプルですが、awkは、特に元の順序を維持したり、より複雑な重複削除のニーズを処理したりする場合に、優れた柔軟性と制御を提供します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です