萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux sort 指令進階排序實戰:去重、反轉、多鍵值、數值/字典序混合排序

sort 是文本處理核心工具,支援多欄位、多鍵值、數值/字典序混合排序。本文系統整理參數語法與實戰範例。

基礎語法

sort [選項] [檔案...]
# 預設: 以 ASCII 碼值由左至右字典序排序
# 欄位分隔符預設為空白 (空格/Tab 連續視為一個)

常用參數

參數功能
-u, --unique去除重複行 (輸出唯一行)
-r, --reverse反向排序
-n, --numeric-sort數值排序 (而非字典序)
-f, --ignore-case忽略大小寫
-t CHAR指定欄位分隔符 (預設空白)
-k KEYDEF指定排序鍵值範圍
-s, --stable穩定排序 (保持相等鍵值原序)
-o FILE輸出至檔案 (可同輸入檔)

-k 鍵值定義語法詳細

-k FStart[.CStart][Modifier] [, FEnd[.CEnd][Modifier]]
# FStart: 起始欄位號 (1-based)
# CStart: 起始欄位內字元位置 (1-based)
# FEnd/CEnd: 結束欄位/字元 (省略 = 行尾/欄位尾)
# Modifier: n(數值) r(反向) f(忽略大小寫) b(忽略前導空白) M(月份) h(人類可讀數值) V(版本號)

實戰範例

1. 簡單去重與反轉

sort -u file.txt           # 去重
sort -r file.txt           # 反向字典序
sort -ru file.txt          # 反向去重

2. 數值排序 (預設字典序 1, 10, 2 錯誤)

echo -e "10\n2\n1\n20" | sort -n
# 1
# 2
# 10
# 20

3. 指定分隔符與欄位排序

# /etc/passwd 以 : 分隔,按第 3 欄 UID 數值排序
sort -t: -k3,3n /etc/passwd

# CSV 按第 2 欄日期、第 1 欄名稱排序
sort -t, -k2,2 -k1,1 data.csv

4. 複雜多鍵值混合排序

# facebook.txt 格式: 名稱 年齡 分數
# 第 2 欄第 2 字元 到 第 3 欄第 1 字元 數值排序
# 第 1 欄 反向字典序
sort -n -k 2.2,3.1 -k 1,1r facebook.txt

5. 版本號排序 (V 修飾符)

echo -e "1.10\n1.2\n1.1\n2.0" | sort -V
# 1.1
# 1.2
# 1.10
# 2.0

6. 人類可讀大小排序 (h 修飾符)

du -h | sort -k1,1h
# 4K
# 8M
# 1G

7. 月份排序 (M 修飾符)

echo -e "Dec\nJan\nFeb" | sort -k1,1M
# Jan
# Feb
# Dec

進階技巧

  • 大檔案外部排序:sort -S 1G -T /tmp/bigsort bigfile.txt (指定記憶體緩衝、臨時目錄)
  • 平行排序:sort --parallel=4 bigfile.txt (多核心加速)
  • 隨機排序:sort -R (雜湊基礎偽隨機)
  • 合併已排序檔案:sort -m sorted1.txt sorted2.txt (極快,不重新排序)
  • 檢查是否已排序:sort -c file.txt (已排序退出碼 0,否則 >0)

sort 排序示意

與 uniq 搭配

sort file.txt | uniq -c | sort -rn
# 統計行出現次數並按頻率降序 (常用於日誌分析)

掌握 sort -k 多鍵值語法與修飾符,能處理 90% 以上文本排序需求,是資料前處理與日誌分析的基石技能。

copyright © 萬盛學電腦網 all rights reserved