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 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