Linux でファイル内の一意の行を数える

Olorunfemi Akinlua 2023年6月20日
  1. sort および uniq コマンドを使用してファイル内の一意の行をカウントする
  2. awk コマンドを使用してファイル内の一意の行をカウントする
Linux でファイル内の一意の行を数える

ファイル内の一意の行をカウントすることは、Linux では一般的なタスクであり、この操作を実行するためにいくつかの異なるツールと方法を使用できます。 一般に、適切な方法は、入力ファイルのサイズ、パフォーマンスとメモリの要件、データの形式と内容など、タスクの特定の要件と制約によって異なります。

sort および uniq コマンドを使用してファイル内の一意の行をカウントする

Linux でファイル内の一意の行をカウントする方法の 1つは、sort および uniq コマンドを使用することです。 sort コマンドは指定された順序で入力データを並べ替え、uniq コマンドは並べ替えられたデータから重複する行を除外します。

data.txt ファイルには、この記事の例として以下の内容が含まれています。

arg1
arg2
arg3
arg2
arg2
arg1

ファイル内の一意の行数をカウントするには、次のコマンドを使用できます。

sort data.txt | uniq -c | wc -l

出力:

3

このコマンドは、data.txt ファイルを昇順 (デフォルト) でソートし、出力を uniq コマンドにパイプします。 uniq コマンドは、並べ替えられたデータから重複する行を除外し、入力に含まれる各行の回数を追加します。

次に、出力は wc コマンドにパイプされます。このコマンドは、入力の行数をカウントし、結果を端末に出力します。

sort および uniq コマンドは、ファイル内の一意の行をカウントするためのシンプルで効率的なツールであり、ほとんどの一般的なシナリオに適しています。 ただし、入力データを並べ替える必要があるなど、いくつかの制限と欠点があります。これは、大きなファイルの場合、速度が遅くなり、メモリを大量に消費する可能性があります。

さらに、uniq コマンドは、並べ替えられたデータから隣接する重複行のみを削除するため、入力によっては期待どおりの結果が得られない場合があります。

awk コマンドを使用してファイル内の一意の行をカウントする

Linux でファイル内の一意の行をカウントするもう 1つの方法は、テキスト ファイルに対してさまざまな操作を実行できる強力なテキスト処理ツールである awk コマンドを使用することです。 awk コマンドには組み込みの連想配列データ構造があり、入力内の各行の出現回数を保存およびカウントできます。

たとえば、data.txt というファイルの一意の行数をカウントするには、次のコマンドを使用できます。

awk '!a[$0]++' data.txt | wc -l

出力:

3

このコマンドは、awk コマンドを使用して data.txt ファイルを読み取り、各入力行に単純な条件を適用します。 条件は !a[$0]++ 式を使用します。この式は、読み取り行ごとに a 配列の値をインクリメントします。

これは、各行が入力に現れる回数を効果的にカウントし、そのカウントを a 配列に格納します。

awk コマンドは、! を適用します。 配列要素の値を否定する a[$0] 式への演算子。 これは、a 配列でカウントが 0 の行のみが条件を通過し、出力に出力されることを意味します。

次に、出力は wc コマンドにパイプされます。このコマンドは、入力の行数をカウントし、結果を端末に出力します。

awk コマンドは、その動作を制御し、その出力をカスタマイズするために使用できるいくつかのオプションと機能も提供します。 たとえば、-F オプションを使用して別のフィールド セパレータを指定したり、-v オプションを使用してスクリプトで使用できる変数を定義したりできます。

printf 関数を使用して、awk コマンドの出力をさまざまな方法でフォーマットすることもできます。

これらの機能を使用して data.txt というファイル内の一意の行数をカウントする、より複雑な awk スクリプトの例を次に示します。ここで、各行はコンマで区切られたフィールドのリストです。

awk -F, '{a[$1]++} END {for (i in a) { printf "%s,%d\n", i, a[i] }}' data.txt | wc -l

出力:

3

このスクリプトは、-F オプションを使用して , 文字をフィールド セパレータとして指定し、入力内の各フィールドの出現回数を保存およびカウントするために使用される a 配列を定義します。

awk コマンドは、data.txt ファイルの各行を読み取り、読み取ったフィールドごとに a 配列の値をインクリメントします。 これにより、一意の各フィールドが入力に表示される回数が効果的にカウントされます。

スクリプトの END ブロックは、入力のすべての行が読み取られた後に実行され、for ループを使用して a 配列を反復処理します。 printf 関数は、awk コマンドの出力をフォーマットするために使用され、各一意のフィールドとそのカウントを出力に出力します。

次に、出力は wc コマンドにパイプされます。このコマンドは、入力の行数をカウントし、結果を端末に出力します。

結論として、Linux でファイル内の一意の行を数える方法はいくつかあり、適切な方法はタスクの特定の要件と制約によって異なります。 sort および uniq コマンドは、一意の行をカウントするためのシンプルで効率的なツールです。awk コマンドは、スクリプトの出力と動作をカスタマイズするためのより高度な機能とオプションを提供します。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

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

関連記事 - Linux File