Bash で重複行を削除する
エントリが重複していると、Bash スクリプトでさまざまな問題が発生する可能性があります。たとえば、結果が正しくなかったり一貫性がなかったりするだけでなく、スクリプトの保守が困難になる可能性もあります。 これらの問題を回避するには、多くの場合、スクリプトから重複するエントリを削除する必要があり、Bash でこれを行う方法は多数あります。
sort
と uniq
を使用して Bash で重複行を削除する
Bash スクリプトで重複するエントリを削除する方法の 1つは、sort
および uniq
コマンドを使用することです。 sort
コマンドは指定された順序で入力データを並べ替え、uniq
コマンドは並べ替えられたデータから重複する行を除外します。
data.txt
ファイルには、この記事の例として以下の内容が含まれています。
arg1
arg2
arg3
arg2
arg2
arg1
上記のファイルから重複するエントリを削除するには、次のコマンドを使用できます。
sort data.txt | uniq > data-unique.txt
出力 (touch data-unique.txt
):
arg1
arg2
arg3
このコマンドは、data.txt
ファイルを昇順 (デフォルト) でソートし、出力を uniq
コマンドにパイプします。 uniq
コマンドは、並べ替えられたデータから重複する行を除外し、結果を data-unique.txt
という新しいファイルに書き込みます。
これにより、data.txt
ファイルからすべての重複エントリが削除され、一意のエントリを持つ新しいファイルが作成されます。
uniq
コマンドには、重複行のみを表示する -d
オプションや、各行の出現回数を表示する -c
オプションなど、その動作を制御するために使用できるいくつかのオプションがあります。 入力で。 たとえば、data.txt
ファイルの各行の出現回数を出力するには、次のコマンドを使用できます。
sort data.txt | uniq -c
このコマンドは前のコマンドに似ていますが、uniq
コマンドに -c
オプションが追加されています。 これにより、各行が入力に表示される回数と行自体が出力されます。
たとえば、結果は次のようになります。
2 arg1
3 arg2
1 arg3
この出力は、Line 1 が表示されていることを示しています。
awk
コマンドを使用して Bash で重複行を削除する
Bash スクリプトで重複するエントリを削除する別の方法は、テキスト ファイルに対して多数の操作を実行できる強力なテキスト処理ツールである awk
コマンドを使用することです。 awk
コマンドには組み込みの連想配列データ構造があり、入力内の各行の出現回数を保存およびカウントできます。
たとえば、以前と同じファイルから重複するエントリを削除するには、次のコマンドを使用できます。
awk '!a[$0]++' data.txt > data-unique.txt
出力:
arg1
arg2
arg3
このコマンドは、awk
コマンドを使用して data.txt
ファイルを読み取り、各入力行に単純な条件を適用します。 条件は !a[$0]++
式を使用します。この式は、読み取り行ごとに a
配列の値をインクリメントします。
これは、各行が入力に現れる回数を効果的にカウントし、そのカウントを a
配列に格納します。
awk
コマンドは、!
を適用します。 配列要素の値を否定する a[$0]
式への演算子。 これは、a
配列でカウントが 0 の行のみが条件を通過し、出力に出力されることを意味します。 出力は、data-unique.txt
という名前の新しいファイルにリダイレクトされ、data.txt
ファイルからの一意のエントリが含まれます。
awk
コマンドは、その動作を制御し、その出力をカスタマイズするために使用できるいくつかのオプションと機能も提供します。 たとえば、-F
オプションを使用して別のフィールド セパレータを指定したり、-v
オプションを使用してスクリプト内の変数を定義したりできます。
printf
関数を使用して、awk
コマンドの出力をさまざまな方法でフォーマットすることもできます。
sort
および uniq
コマンドは、重複するエントリを削除するためのシンプルで効率的なツールです。awk
コマンドは、スクリプトの出力と動作をカスタマイズするためのより高度な機能とオプションを提供します。
Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.
LinkedIn