はじめに
LinuxやUNIX系環境でテキスト処理を行う際、awkとsortは非常に便利なコマンドです。
awkは列の抽出や条件指定、sortは並び替えを担当し、uniqを組み合わせることで重複削除や件数集計も行えます。
本記事では、awkとsortを使った基本的なテキスト処理から実践的なログ解析まで、初心者が理解しやすい形で整理して解説します。
参考: GNU awk
awkとsortの基本構文と使い方
ファイル作成
cat << 'EOF' > input.txt
apple 300
orange 150
banana 200
grape 180
apple 120
EOF
実行コマンド
awk '{ print $1, $2 }' input.txt
実行結果
apple 300
orange 150
banana 200
grape 180
apple 120
実行コマンド
awk '{ sum += $2 } END { print "total =", sum }' input.txt
実行結果
total = 950
実行コマンド
sort input.txt
実行結果
apple 120
apple 300
banana 200
grape 180
orange 150
実行コマンド
sort -k2 -n input.txt
実行結果
apple 120
orange 150
grape 180
banana 200
apple 300
仕組み
| コマンド | 仕組み | 用途 |
|---|---|---|
| awk '{ print $1, $2 }' | 空白区切りで列を処理 | 列抽出 |
| awk '{ sum += $2 } END { print sum }' | 2列目を加算しENDで出力 | 合計計算 |
| sort input.txt | 文字列順で並び替え | 辞書順ソート |
| sort -k2 -n input.txt | 2列目を数値として並び替え | 数値ソート |
解説
awkは列単位でデータ加工できる強力なテキスト処理コマンドです。
sortはログやCSV風データを条件別に並び替える際によく利用されます。
awk・sort・uniqの役割の違い
ファイル作成
cat << 'EOF' > input.txt
apple
orange
banana
apple
banana
grape
orange
apple
EOF
実行コマンド
awk '{print $1}' input.txt
実行結果
apple
orange
banana
apple
banana
grape
orange
apple
実行コマンド
sort input.txt
実行結果
apple
apple
apple
banana
banana
grape
orange
orange
実行コマンド
sort input.txt | uniq
実行結果
apple
banana
grape
orange
仕組み
| コマンド | 役割 | 特徴 | 主な用途 |
|---|---|---|---|
| awk | テキスト加工 | 列単位で処理できる | 抽出・集計 |
| sort | 並び替え | 昇順・降順に整列 | データ整理 |
| uniq | 重複削除 | 連続した重複のみ削除 | 重複チェック |
解説
awk はテキストを列ごとに扱えるため、ログ解析やCSV処理でよく利用されます。
sort と uniq を組み合わせることで、重複データの整理を効率的に行えます。
awkとsortを組み合わせる基本パターン
ファイル作成
cat << 'EOF' > input.txt
orange 120
apple 80
banana 200
grape 150
melon 90
EOF
実行コマンド
awk '{print $2, $1}' input.txt | sort -n
実行結果
80 apple
90 melon
120 orange
150 grape
200 banana
実行コマンド
awk '{print $2, $1}' input.txt | sort -nr
実行結果
200 banana
150 grape
120 orange
90 melon
80 apple
仕組み
| コマンド | 役割 |
|---|---|
| awk '{print $2, $1}' | 2列目を先頭に並べ替え用データへ変換 |
| sort -n | 数値として昇順ソート |
| sort -nr | 数値として降順ソート |
| | | awkの出力をsortへ渡すパイプ処理 |
解説
awkで列の順番を変更し、sortで並び替えるのが基本パターンです。
数値ソートには -n、降順には -r を組み合わせるのが定番です。
awkとsortで数値・文字列を並び替える方法
ファイル作成
cat << 'EOF' > input.txt
orange 15
apple 3
banana 27
grape 9
melon 21
EOF
実行コマンド
awk '{print $2, $1}' input.txt | sort -n
実行結果
3 apple
9 grape
15 orange
21 melon
27 banana
実行コマンド
awk '{print $1, $2}' input.txt | sort
実行結果
apple 3
banana 27
grape 9
melon 21
orange 15
仕組み
| コマンド | 仕組み |
|---|---|
| awk '{print $2, $1}' | 2列目の数値を先頭に並べ替えて出力 |
| sort -n | 数値として昇順ソート |
| awk '{print $1, $2}' | 1列目の文字列をそのまま出力 |
| sort | 文字列をアルファベット順でソート |
解説
awk は列の入れ替えや抽出に便利で、sort と組み合わせることで柔軟な並び替えができます。
数値ソートは -n、文字列ソートはオプションなしを使うのが基本です。
awkとsortで昇順・降順を切り替える方法
ファイル作成
cat << 'EOF' > input.txt
orange 30
apple 10
banana 20
grape 15
EOF
実行コマンド
awk '{print $2, $1}' input.txt | sort -n
実行結果
10 apple
15 grape
20 banana
30 orange
実行コマンド
awk '{print $2, $1}' input.txt | sort -nr
実行結果
30 orange
20 banana
15 grape
10 apple
仕組み
| コマンド | 役割 |
|---|---|
| awk '{print $2, $1}' | 2列目を先頭に並べ替え用データを生成 |
| sort -n | 数値として昇順ソート |
| sort -nr | 数値として降順ソート |
| | | awkの出力をsortへ渡す |
解説
sort -n は数値の昇順、sort -nr は逆順で降順になります。
awk を組み合わせることで、任意の列を基準に柔軟にソートできます。
awkとsortで列単位にソートする方法
ファイル作成
cat << 'EOF' > input.txt
id name score
3 Suzuki 82
1 Tanaka 95
5 Sato 76
2 Yamada 88
4 Kobayashi 91
EOF
実行コマンド
awk 'NR==1{header=$0; next} {print}' input.txt | sort -k1,1n | awk 'BEGIN{print "id name score"} {print}'
実行結果
id name score
1 Tanaka 95
2 Yamada 88
3 Suzuki 82
4 Kobayashi 91
5 Sato 76
実行コマンド
awk 'NR==1{header=$0; next} {print}' input.txt | sort -k3,3nr | awk 'BEGIN{print "id name score"} {print}'
実行結果
id name score
1 Tanaka 95
4 Kobayashi 91
2 Yamada 88
3 Suzuki 82
5 Sato 76
仕組み
| コマンド | 仕組み |
|---|---|
| awk 'NR==1{header=$0; next} {print}' | ヘッダー行を除外してデータ部分のみ出力 |
| sort -k1,1n | 1列目を数値として昇順ソート |
| sort -k3,3nr | 3列目を数値として降順ソート |
| awk 'BEGIN{print "id name score"}' | ソート後にヘッダー行を再表示 |
解説
awk でヘッダーを除外し、sort で対象列を並び替えることで列単位のソートを実現しています。
sort の n は数値順、r は逆順を意味します。
awkとsortで区切り文字を指定してソートする方法
ファイル作成
cat << 'EOF' > input.txt
orange:30
apple:10
banana:20
grape:15
EOF
実行コマンド
awk -F ':' '{print $1, $2}' input.txt
実行結果
orange 30
apple 10
banana 20
grape 15
実行コマンド
awk -F ':' '{print $1, $2}' input.txt | sort -k2 -n
実行結果
apple 10
grape 15
banana 20
orange 30
仕組み
| コマンド | 役割 |
|---|---|
| awk -F ':' | : を区切り文字として指定 |
| {print $1, $2} | 1列目と2列目を出力 |
| sort -k2 -n | 2列目を数値として昇順ソート |
解説
awk の -F オプションで区切り文字を指定できます。
その出力を sort に渡すことで、任意の列を柔軟にソートできます。
awkとsortでCSVファイルをキー指定でソートする方法
ファイル作成
cat << 'EOF' > input.txt
id,name,score
3,Suzuki,82
1,Tanaka,95
2,Sato,88
4,Yamada,70
EOF
実行コマンド
awk -F',' 'NR==1{print;next} {print | "sort -t, -k1,1n"}' input.txt
実行結果
id,name,score
1,Tanaka,95
2,Sato,88
3,Suzuki,82
4,Yamada,70
実行コマンド
awk -F',' 'NR==1{print;next} {print | "sort -t, -k3,3nr"}' input.txt
実行結果
id,name,score
1,Tanaka,95
2,Sato,88
3,Suzuki,82
4,Yamada,70
仕組み
| コマンド | 役割 |
|---|---|
| awk -F',' | CSVの区切り文字を,として処理 |
| NR==1{print;next} | ヘッダー行だけ先に表示 |
| sort -t, | ,区切りでソート |
| -k1,1n | 1列目を数値昇順でソート |
| -k3,3nr | 3列目を数値降順でソート |
解説
awkでヘッダー行を維持しながら、データ部分のみをsortへ渡しています。
CSVの列番号を変更するだけで、任意のキーによる並び替えが可能です。
awkとsortで重複行を削除する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apple
orange
banana
grape
EOF
実行コマンド
awk '!seen[$0]++' input.txt
実行結果
apple
banana
orange
grape
実行コマンド
sort -u input.txt
実行結果
apple
banana
grape
orange
仕組み
| コマンド | 仕組み |
|---|---|
| awk '!seen[$0]++' input.txt | 配列 seen に行を記録し、初回のみ出力する |
| sort -u input.txt | ソート後に重複行を自動で削除する |
解説
awk は入力順を維持したまま重複削除できます。
sort -u は並び替えと重複削除を同時に行えるため、大量データ処理で便利です。
awkとsortでユニーク件数を集計する方法
ファイル作成
cat << 'EOF' > input.txt
apple red
banana yellow
apple red
orange orange
banana yellow
apple green
EOF
実行コマンド
awk '{print $1}' input.txt | sort | uniq -c
実行結果
3 apple
2 banana
1 orange
実行コマンド
awk '{print $1}' input.txt | sort | uniq | wc -l
実行結果
3
仕組み
| コマンド | 役割 |
|---|---|
| awk '{print $1}' | 1列目だけを抽出 |
| sort | 同じ値を並べて集計しやすくする |
| uniq -c | 重複件数をカウント |
| uniq | 重複を除外 |
| wc -l | 行数を数えてユニーク件数を表示 |
解説
awkで必要な列を抽出し、sortで並び替えることでuniqによる重複判定が可能になります。
ログ解析やCSV集計など、シェルでのデータ分析でよく使われる組み合わせです。
awkとsortで集計結果をランキング表示する方法
ファイル作成
cat << 'EOF' > input.txt
apple
orange
apple
banana
orange
apple
banana
grape
orange
apple
EOF
実行コマンド
awk '{count[$1]++} END {for (word in count) print count[word], word}' input.txt
実行結果
4 apple
2 banana
1 grape
3 orange
実行コマンド
awk '{count[$1]++} END {for (word in count) print count[word], word}' input.txt | sort -nr
実行結果
4 apple
3 orange
2 banana
1 grape
仕組み
| コマンド | 役割 |
|---|---|
| awk '{count[$1]++}' | 1列目の文字列をキーにして件数をカウント |
| END {for (word in count) ...} | 集計結果を最後に出力 |
| sort -nr | 数値として降順に並び替え |
| count[word] | awkの連想配列で出現回数を保持 |
解説
awkでデータを集計し、sortでランキング形式に並び替えることで、ログ解析や頻度調査を簡単に実現できます。特に sort -nr を組み合わせることで、件数順の見やすい集計結果を素早く作成できます。
awkとsortで特定条件の行だけをソートする方法
ファイル作成
cat << 'EOF' > input.txt
id,name,score
101,Alice,82
102,Bob,67
103,Charlie,91
104,David,75
105,Eve,88
EOF
実行コマンド
awk -F',' 'NR > 1 && $3 >= 80' input.txt | sort -t',' -k3,3nr
実行結果
103,Charlie,91
105,Eve,88
101,Alice,82
仕組み
| 処理 | 内容 |
|---|---|
| awk | 1行目のヘッダーを除外しつつ条件一致行を抽出 |
| NR > 1 | 1行目(id,name,score)を除外 |
| $3 >= 80 | 3列目(score)が80以上の行のみ対象 |
| sort | 抽出した結果を並び替え |
| -t',' | カンマ区切りを指定 |
| -k3,3nr | 3列目を数値として降順ソート |
解説
NR > 1を追加することでヘッダー行を除外できます。
awkで絞り込み、sortで並び替えるのが定番の組み合わせです。
awkとsortでログ解析する方法
ファイル作成
cat << 'EOF' > input.txt
2026-05-16 10:01:25 INFO userA login
2026-05-16 10:03:11 ERROR userB timeout
2026-05-16 10:04:09 INFO userC upload
2026-05-16 10:05:44 ERROR userA disconnect
2026-05-16 10:06:30 WARN userD retry
2026-05-16 10:07:12 ERROR userC timeout
EOF
実行コマンド
awk '$3=="ERROR" {print $4, $5}' input.txt
実行結果
userB timeout
userA disconnect
userC timeout
実行コマンド
awk '$3=="ERROR" {print $4}' input.txt | sort
実行結果
userA
userB
userC
実行コマンド
awk '{count[$3]++} END {for (level in count) print level, count[level]}' input.txt | sort
実行結果
ERROR 3
INFO 2
WARN 1
仕組み
| コマンド | 仕組み |
|---|---|
| awk '$3=="ERROR"' | 3列目がERRORの行だけ抽出 |
| print $4 | 4列目のユーザー名を表示 |
| sort | 結果を昇順で並び替え |
| count[$3]++ | ログレベルごとの件数を集計 |
| END {for ...} | 最後に集計結果を出力 |
解説
awkは列単位でログを効率よく抽出でき、sortを組み合わせることで集計や整理が簡単になります。
大量ログの解析でも軽量かつ高速に動作するため、サーバー運用でよく利用されます。
awkとsortで日付データを並び替える方法
ファイル作成
cat << 'EOF' > input.txt
2024-12-01 Tokyo
2023-05-10 Osaka
2025-01-15 Nagoya
2022-08-20 Fukuoka
EOF
実行コマンド
awk '{print $1, $2}' input.txt | sort
実行結果
2022-08-20 Fukuoka
2023-05-10 Osaka
2024-12-01 Tokyo
2025-01-15 Nagoya
実行コマンド
awk '{print $1, $2}' input.txt | sort -r
実行結果
2025-01-15 Nagoya
2024-12-01 Tokyo
2023-05-10 Osaka
2022-08-20 Fukuoka
仕組み
| コマンド | 仕組み |
|---|---|
| awk '{print $1, $2}' input.txt | 1列目の日付と2列目の都市名を抽出 |
| sort | 日付を昇順で並び替え |
| sort -r | 日付を降順で並び替え |
解説
awkで必要な列だけを取り出し、sortで日付順に整列しています。
ISO形式(YYYY-MM-DD)の日付は文字列ソートでも正しい順番になります。
awkとsortでIPアドレスを整理・集計する方法
ファイル作成
cat << 'EOF' > input.txt
192.168.1.10 access
10.0.0.5 access
192.168.1.10 error
172.16.0.1 access
10.0.0.5 access
192.168.1.10 access
EOF
実行コマンド
awk '{print $1}' input.txt
実行結果
192.168.1.10
10.0.0.5
192.168.1.10
172.16.0.1
10.0.0.5
192.168.1.10
実行コマンド
awk '{print $1}' input.txt | sort
実行結果
10.0.0.5
10.0.0.5
172.16.0.1
192.168.1.10
192.168.1.10
192.168.1.10
実行コマンド
awk '{print $1}' input.txt | sort | uniq -c
実行結果
2 10.0.0.5
1 172.16.0.1
3 192.168.1.10
仕組み
| コマンド | 仕組み |
|---|---|
| awk '{print $1}' | 1列目のIPアドレスだけを抽出 |
| sort | IPアドレスを昇順で並び替え |
| uniq -c | 重複をまとめて件数を集計 |
解説
awkで必要な列を取り出し、sortで整列することでuniq -cによる集計が可能になります。
ログ解析やアクセス集計でよく使われる基本的なコマンド連携です。
awkとsortを活用したテキスト処理の基本まとめ
awkとsortは、テキスト処理を効率化する代表的なコマンドです。
awkで必要なデータを抽出し、sortで整列する流れを覚えるだけでも、CSV管理やログ解析が大幅に簡単になります。
まずは小さなサンプルデータでawkとsortを試しながら、少しずつ実践的な使い方に慣れていくことをおすすめします。
