テキストファイルから重複行を削除することは、Bashスクリプトにおける一般的なタスクです。この記事では、sort
とuniq
を使用する方法、そしてawk
を活用する方法という2つの効率的な方法を解説します。
目次
sort
とuniq
を使う
このアプローチは、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
は、特に元の順序を維持したり、より複雑な重複削除のニーズを処理したりする場合に、優れた柔軟性と制御を提供します。