🌟

AWK(オーク)使い方の保存版

2024/06/06に公開

AWK

AWKは、テキストデータを効率的に処理するためのプログラミング言語およびツールです。
主に空白やカンマで区切られたデータの解析に用いられます。
簡潔なスクリプトで複雑なテキスト操作が可能で、一般的なプログラミングにも対応します。

基本

基本的構文

awk 'pattern {action}' your_filename

pattern: マッチングするパターン(省略可能)
action: マッチングする行に対して実行するアクション(省略可能)

例1: ファイルの各行をそのまま表示

awk '{print}' filename

例2: 各行の第1フィールドと第3フィールドを表示

awk '{print $1, $3}' filename

例3: 第3フィールドの値が100より大きい行のみを表示

awk '$3 > 100 {print $1, $3}' filename

例4: Start of Fileを表示した後、各行をそのまま表示し、最後にEnd of Fileを表示

awk 'BEGIN {print "Start of File"} {print} END {print "End of File"}' filename

一行目と最終行を表示

awk 'NR==1 {print} END {print}' filename

一行目と三行目を表示

awk 'NR==1 || NR==3 { print }' filename

応用

関数の使用

sample.txt
Alice 3
Bob 4
Charlie 5
awk '
function square(x) { return x * x }
{print $1, square($2)}
' sample.txt

出力:

Alice 9
Bob 16
Charlie 25

パターンマッチング

test.log
Info: System started
Error: Failed to connect to server
Warning: Low disk space
Error: Invalid user input
Info: System shutdown
awk '/^Error/ {print}' test.log

出力:

Error: Failed to connect to server
Error: Invalid user input

外部コマンドの呼び出し

sample.txt
Alice 3
Bob 4
Charlie 5
awk 'BEGIN {system("date")} {print $1, $2}' sample.txt

出力:

Thu Jun  6 17:58:43 JST 2024
Alice 3
Bob 4
Charlie 5

実用例

CSVファイルのレポート集計

csvファイル解析では、-F, (--field-separator=,) を指定します。

sample.csv
Name,Age,Salary
Alice,30,60000
Bob,25,50000
Charlie,35,70000

例1: 年齢が30以上の人の氏名及び年齢を抽出

awk -F, '$2 >= 30 {print $1, $2}' sample.csv

出力:

Name Age
Alice 30
Charlie 35

例2: 合計給与を計算

awk -F, 'NR > 1 {sum += $3} END {print "Total Salary:", sum}' sample.csv

出力:

Total Salary: 180000

例3: 平均給与を計算

awk -F, 'NR > 1 {sum += $3; count++} END {print "Average Salary:", sum/count}' sample.csv

出力:

Average Salary: 60000

例4: 1列目と2列目を取得し、2列目昇順でソート(ヘッダーあり)

awk -F, 'NR == 1 {print $1, $2}' sample.csv && awk -F, 'NR > 1 {print $1, $2}' sample.csv | sort -k2,2n

出力:

Name Age
Bob 25
Alice 30
Charlie 35

例5: 1列目と2列目を取得し、2列目降順でソート(ヘッダーあり)

awk -F, 'NR == 1 {print $1, $2}' sample.csv && awk -F, 'NR > 1 {print $1, $2}' sample.csv | sort -k2,2nr

出力:

Name Age
Charlie 35
Alice 30
Bob 25

TSVファイルのレポート集計

tsvファイル解析では、-F'\t' (--field-separator='\t') を指定します。

例1: 年齢が30以上の人の氏名及び年齢を抽出

awk -F'\t' '$2 >= 30 {print $1, $2}' sample.tsv

出力:

Name Age
Alice 30
Charlie 35

ファイル変換

例1: CSVをTSVに変換
$番号は列の数だけ記述必要。OFSのタブで列を結合している。

awk 'BEGIN {FS=","; OFS="\t"} {print $1, $2, $3}' sample.csv > sample.tsv

例2: TSVをCSVに変換
$番号は列の数だけ記述必要。OFSのカンマで列を結合している。

awk 'BEGIN {FS="\t"; OFS=","} {print $1, $2, $3}' sample.tsv > sample.csv

ログ集計

sample.log
2024-06-01 10:00:00 INFO User logged in
2024-06-01 10:05:00 ERROR Failed to load resource
2024-06-01 10:10:00 INFO User logged out
2024-06-01 10:15:00 WARNING Low disk space
2024-06-01 10:20:00 INFO User logged in

例1: ERRORメッセージを抽出

awk '/ERROR/ {print}' sample.log

出力:

2024-06-01 10:05:00 ERROR Failed to load resource

例2: 日時とログレベルを表示

awk '{print $1, $2, $3}' sample.log

出力:

2024-06-01 10:00:00 INFO
2024-06-01 10:05:00 ERROR
2024-06-01 10:10:00 INFO
2024-06-01 10:15:00 WARNING
2024-06-01 10:20:00 INFO

例3: INFOログの回数をカウント

awk '/INFO/ {count++} END {print "INFO count:", count}' sample.log

出力:

INFO count: 3

例4: 各ログレベルの出現回数をカウント

awk '{count[$3]++} END {for (level in count) print level, count[level]}' sample.log

出力:

WARNING 1
ERROR 1
INFO 3

まとめ

今回の保存版では、基本的な使い方から高度な応用例まで幅広くカバーしました。これを活用して、効率的なデータ解析と処理を行いましょう。

Discussion