テキストファイルを整形・集計する場面で頻繁に登場する sort・uniq・cut の3つのコマンドを学びます。
パイプで組み合わせることで、CSV の集計やログ解析など実務的な処理ができるようになります。
sort:行を並び替える
sort はファイルの各行をアルファベット順(デフォルト)や数値順に並び替えます。
sort names.txt
よく使うオプション
| オプション | 意味 |
|---|---|
-r | 逆順(降順)に並べる |
-n | 数値として並べる |
-u | 重複行を除いて並べる(uniq 相当) |
-k N | N番目のフィールドを基準に並べる |
-t ',' | 区切り文字を指定する |
数値ファイルをそのままソートすると辞書順になり正しく並びません。-n を付けると数値として正しくソートされます。
# 辞書順(誤り)
echo -e "10\n2\n20\n1" | sort
# → 1, 10, 2, 20
# 数値順(正しい)
echo -e "10\n2\n20\n1" | sort -n
# → 1, 2, 10, 20
複数列があるファイルで特定の列を基準にソートするには -k を使います。
# scores.txt の内容例:
# Alice 85
# Bob 92
# Carol 78
# 第2列(点数)を数値の降順でソート
sort -k2 -n -r scores.txt
uniq:連続する重複行を除去・カウントする
uniq は 連続して重なる 行を処理します。重複している行が隣り合っていない場合は除去されないため、通常は sort と組み合わせて使います。
# ソートしてから重複を除去
sort fruits.txt | uniq
よく使うオプション
| オプション | 意味 |
|---|---|
-c | 各行が何回出現したかを先頭に表示 |
-d | 重複している行だけを表示 |
-u | 一度しか現れない行だけを表示 |
# アクセスログから IP アドレスを抽出し、出現回数でランキング
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head -10
上の例では4つのコマンドをパイプでつないでいます。これが sort・uniq・cut の典型的な使い方です。
cut:列(フィールド)を切り出す
cut はテキストの各行から特定の列や文字位置を取り出します。
区切り文字で列を指定する(-d と -f)
CSV や空白区切りのテキストに便利です。
# カンマ区切りの第1列と第3列を取り出す
cut -d',' -f1,3 data.csv
# コロン区切りの第1列(/etc/passwd のユーザー名一覧)
cut -d':' -f1 /etc/passwd
-f には範囲指定も使えます。
cut -d',' -f1-3 # 第1〜3列
cut -d',' -f2- # 第2列以降すべて
文字位置で切り出す(-c)
固定長フォーマットのテキストに使います。
# 各行の1〜5文字目を取り出す
cut -c1-5 logfile.txt
3つのコマンドを組み合わせた実践例
例1:CSV から特定列を集計する
# sales.csv(商品,地域,金額)から地域ごとの売上件数を集計
# 地域(第2列)を取り出してソート→重複カウント
cut -d',' -f2 sales.csv | sort | uniq -c | sort -rn
例2:ログからユニーク IP を数える
# Nginx アクセスログの第1フィールドが IP アドレス
cut -d' ' -f1 /var/log/nginx/access.log | sort -u | wc -l
例3:/etc/passwd からユーザー一覧を作る
# ログインシェルが /bin/bash のユーザーだけ抽出してソート
grep '/bin/bash' /etc/passwd | cut -d':' -f1 | sort
練習問題
問題 1
次の内容のファイル scores.txt があります。
Carol 78
Alice 85
Bob 92
Dave 85
Eve 63
「点数を数値の降順でソートして表示」 するコマンドを書いてください。
問題 2
以下のファイル fruits.txt があります。
apple
banana
apple
cherry
banana
apple
各果物が何回登場するかを 多い順 に表示するコマンドを書いてください。
問題 3
/etc/passwd から ホームディレクトリ(第6フィールド) の一覧をソートして表示するコマンドを書いてください。
答え
問題 1 の答え
sort -k2 -n -r scores.txt
-k2 で第2列(点数)を基準に、-n で数値として、-r で降順にソートします。
問題 2 の答え
sort fruits.txt | uniq -c | sort -rn
まず sort で同じ果物を隣り合わせにしてから uniq -c で出現回数を数え、sort -rn で数値の降順に並べます。
問題 3 の答え
cut -d':' -f6 /etc/passwd | sort
-d':' でコロンを区切り文字として指定し、-f6 で6番目のフィールド(ホームディレクトリ)を取り出してソートします。