テキスト処理 初級

sort・uniq・cutコマンドでテキストを整形する

テキストファイルの並び替え・重複除去・列抽出に使うsort、uniq、cutコマンドの基本と実践的な組み合わせ方を学ぶ

テキストファイルを整形・集計する場面で頻繁に登場する sortuniqcut の3つのコマンドを学びます。 パイプで組み合わせることで、CSV の集計やログ解析など実務的な処理ができるようになります。

sort:行を並び替える

sort はファイルの各行をアルファベット順(デフォルト)や数値順に並び替えます。

sort names.txt

よく使うオプション

オプション意味
-r逆順(降順)に並べる
-n数値として並べる
-u重複行を除いて並べる(uniq 相当)
-k NN番目のフィールドを基準に並べる
-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つのコマンドをパイプでつないでいます。これが sortuniqcut の典型的な使い方です。

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番目のフィールド(ホームディレクトリ)を取り出してソートします。