ウェブサイト検索

Awk を使用して複数の入力ファイルを処理する


導入

Awk は、開発者、システム管理者、アナリストがさまざまな方法でデータを操作するために広く使用している強力なテキスト処理ツールです。これは、テキスト ファイルを処理し、データを抽出し、さまざまな形式に変換できる多機能ツールです。 Awk の重要な機能の 1 つは、複数の入力ファイルを同時に処理できることであり、バッチ処理タスクに最適です。この記事では、Awk を使用して複数の入力ファイルを処理する方法を検討し、実際にどのように使用できるかをいくつかの例で調べます。

複数の入力ファイルでの Awk の使用

Awk は、テキスト ファイルを処理するように設計されたコマンドライン ツールです。デフォルトでは、Awk は標準入力 (stdin) から入力を読み取ります。入力はファイルからリダイレクトすることも、別のコマンドからパイプすることもできます。ただし、Awk は複数の入力ファイルを同時に処理することもできるため、バッチ処理タスクに役立ちます。

複数の入力ファイルを処理する場合、Awk は各ファイルを入力データの別個のストリームとして扱います。各ファイルを順番に読み取り、各ファイルからの入力データを順番に処理します。これは、同じタイプのデータを含む複数のファイルがある場合、各ファイルを個別に処理するのではなく、Awk を使用してそれらすべてを一度に処理できることを意味します。

複数の入力ファイルからのデータの読み取り

複数の入力ファイルからデータを読み取るには、Awk の実行時にファイル名を引数として指定できます。たとえば、次のデータを含む 2 つのファイル、file1.txt と file2.txt があるとします-

ファイル1.txt -

apple
banana
orange

ファイル2.txt -

carrot
potato

Awkを使用して両方のファイルからデータを読み取り、次のコマンドを使用して画面に出力できます-

awk '{print}' file1.txt file2.txt

このコマンドは、Awk に file1.txt と file2.txt の両方からデータを読み取り、それを画面に出力するように指示します。 '{print}' コマンドは、Awk が入力データの各行に対して実行するアクション (この場合は画面に出力する) を指定するために使用されます。

複数の入力ファイルからのデータを結合する

複数の入力ファイルで Awk を使用するもう 1 つの方法は、ファイルのデータを 1 つの出力ストリームに結合することです。これは、関連データを含む複数のファイルがあり、それらを 1 つのデータ セットに結合する場合に便利です。これを行うには、cat コマンドを使用してファイルを連結し、出力を Awk にパイプします。

たとえば、次のデータを含む 2 つのファイル、file1.txt と file2.txt があるとします-

ファイル1.txt -

1,apple
2,banana
3,orange

ファイル2.txt -

1,carrot
2,potato

次のコマンドを使用して、両方のファイルのデータを単一の出力ストリームに結合できます-

cat file1.txt file2.txt | awk -F ',' '{print $1,$2}'

このコマンドは、cat コマンドを使用して、file1.txt と file2.txt を単一の出力ストリームに連結します。次に、出力ストリームは Awk にパイプされ、-F オプションを使用してフィールド区切り文字としてカンマ (',') を使用するように指示されます。 '{print $1,$2}' コマンドは、入力データの各行の最初と 2 番目のフィールドをスペースで区切って出力するために使用されます。

複数の入力ファイルからのデータの処理-

複数の入力ファイルからのデータの処理には、フィルタリング、並べ替え、集計などのさまざまな操作が含まれる場合があります。 Awk は、これらの操作を実行するために使用できる幅広い組み込み関数を提供しており、データ処理のための強力なツールとなっています。

たとえば、次のデータを含む 2 つのファイル、file1.txt と file2.txt があるとします-

file1.txt

1,apple,0.5
2,banana,0.4
3,orange,0.3

ファイル2.txt -

1,carrot,0.2
2,potato,0.1

Awkを使用して両方のファイルのデータを処理し、次のコマンドを使用してすべての果物と野菜の総重量を計算できます-

awk -F ',' '{if ($2 == "apple" || $2 == "banana" || $2 == "orange") sum += $3; else sum += 0.0} END {print sum}' file1.txt file2.txt

このコマンドは、-F オプションを使用して、フィールド区切り文字としてカンマ (',') を指定します。次に、if ステートメントを使用して file2.txt から果物以外のデータを除外し、両方のファイル内のすべての果物の合計重量を計算します。 sum 変数はゼロに初期化され、フルーツ基準に一致する入力データの各行ごとに増分されます。 END ブロックは合計の最終値を出力するために使用されます。

複数の入力ファイルでの awk の使用例

ディレクトリ内のすべてのファイルの合計サイズを計算する

ディレクトリとそのサブディレクトリ内のすべてのファイルの合計サイズを計算するとします。次のコマンドを使用して、ディレクトリとそのサブディレクトリ内のすべてのファイルのリストを生成し、出力を Awk にパイプして合計サイズを計算できます-

find /path/to/directory -type f -print0 | xargs -0 ls -l | awk '{sum += $5} END {print sum}'

このコマンドは、find コマンドを使用してディレクトリとそのサブディレクトリ内のすべてのファイルのリストを生成し、xargs コマンドを使用してリストを ls -l に渡し、各ファイルの詳細なリストを生成します。 ls -l の出力は Awk にパイプ処理され、$5 フィールドを使用してすべてのファイルの合計サイズをバイト単位で計算します。 END ブロックは合計の最終値を出力するために使用されます。

2 つの CSV ファイルを結合する

関連データを含む 2 つの CSV ファイルがあり、それらを 1 つの CSV ファイルに結合するとします。次のコマンドを使用してファイルをマージし、結果を新しいファイルに出力できます。

awk 'FNR==1 && NR!=1 {next;}{print}' file1.csv file2.csv > merged.csv

このコマンドは、FNR および NR 組み込み変数を使用して、ヘッダー行が出力ファイルに 1 回だけ含まれるようにします。最初のファイルは通常どおり処理されますが、現在の行番号 (FNR) が 1 に等しく、合計行番号 (NR) が 1 に等しくない場合、2 番目のファイルはスキップされます。結果の出力は、新しいファイルmerged.csvにリダイレクトされます。

結論

Awk は、複数の入力ファイルの処理に使用できる強力なテキスト処理ツールです。さまざまな方法でデータを操作するために使用できる幅広い組み込み関数が提供されており、バッチ処理タスクに最適です。複数の入力ファイルを組み合わせることで、Awk はデータ処理ワークフローを合理化し、データ分析タスクの効率を向上させるのに役立ちます。