最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux使用sort命令進(jìn)行文本排序的實(shí)操指南

 更新時(shí)間:2026年03月01日 14:13:21   作者:Jinkxs  
在 Linux 系統(tǒng)中,sort 命令是一個(gè)強(qiáng)大且靈活的文本處理工具,無論是日志分析、數(shù)據(jù)清洗、報(bào)表生成還是系統(tǒng)管理,掌握 sort 的用法都能極大提升工作效率,本文將從基礎(chǔ)語法講起,逐步深入到高級技巧,需要的朋友可以參考下

在 Linux 系統(tǒng)中,sort 命令是一個(gè)強(qiáng)大且靈活的文本處理工具。無論是日志分析、數(shù)據(jù)清洗、報(bào)表生成還是系統(tǒng)管理,掌握 sort 的用法都能極大提升工作效率。本文將從基礎(chǔ)語法講起,逐步深入到高級技巧,并結(jié)合 Java 代碼示例幫助開發(fā)者理解如何在程序中模擬或調(diào)用 sort 功能。文章還會(huì)穿插實(shí)用的 mermaid 圖表輔助理解,同時(shí)提供一些權(quán)威外部資源鏈接供延伸閱讀。

一、初識(shí) sort:基礎(chǔ)語法與簡單應(yīng)用

sort 命令最基本的功能是對文本行進(jìn)行字典序排序。默認(rèn)情況下,它讀取標(biāo)準(zhǔn)輸入或指定文件,按每行內(nèi)容的 ASCII 值升序輸出。

# 對文件 file.txt 進(jìn)行排序
sort file.txt

# 對標(biāo)準(zhǔn)輸入排序(例如管道)
echo -e "banana\napple\ncherry" | sort

輸出結(jié)果:

apple
banana
cherry

常見選項(xiàng)一覽

選項(xiàng)說明
-r逆序排序
-n按數(shù)值排序
-k N指定第 N 列為排序鍵
-t DELIM設(shè)置字段分隔符
-u去重,僅輸出唯一行
-o FILE將結(jié)果輸出到指定文件
-f忽略大小寫
-b忽略前導(dǎo)空白

注意:sort 默認(rèn)不會(huì)修改原文件,除非使用 -o 選項(xiàng)并指定原文件名。

二、Java 模擬基礎(chǔ)排序功能

雖然 Java 本身不直接調(diào)用 Linux 命令,但我們可以編寫程序來模擬 sort 的行為。下面是一個(gè)簡單的 Java 類,實(shí)現(xiàn)對字符串列表的字典序排序:

import java.util.*;

public class SimpleSortSimulator {
    public static void main(String[] args) {
        List<String> lines = Arrays.asList(
            "zebra",
            "apple",
            "banana",
            "Cherry"
        );

        System.out.println("=== 原始順序 ===");
        lines.forEach(System.out::println);

        System.out.println("\n=== 字典序排序(區(qū)分大小寫)===");
        List<String> sorted = new ArrayList<>(lines);
        Collections.sort(sorted);
        sorted.forEach(System.out::println);

        System.out.println("\n=== 忽略大小寫排序 ===");
        sorted.clear();
        sorted.addAll(lines);
        sorted.sort(String.CASE_INSENSITIVE_ORDER);
        sorted.forEach(System.out::println);

        System.out.println("\n=== 逆序排序 ===");
        sorted.sort(Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
        sorted.forEach(System.out::println);
    }
}

輸出結(jié)果:

=== 原始順序 ===
zebra
apple
banana
Cherry

=== 字典序排序(區(qū)分大小寫)===
Cherry
apple
banana
zebra

=== 忽略大小寫排序 ===
apple
banana
Cherry
zebra

=== 逆序排序 ===
zebra
Cherry
banana
apple

這個(gè)例子展示了 Java 中如何通過 Collections.sort() 和比較器實(shí)現(xiàn)類似 sort -fsort -r 的效果。

三、數(shù)值排序:-n 選項(xiàng)詳解

當(dāng)文本包含數(shù)字時(shí),默認(rèn)的字典序排序可能不符合預(yù)期:

echo -e "10\n2\n100\n1" | sort

輸出:

1
10
100
2

這是因?yàn)樽址?'2' 的 ASCII 值大于 '1',所以 "2" 排在 "10" 后面。要按數(shù)值大小排序,必須使用 -n

echo -e "10\n2\n100\n1" | sort -n

輸出:

1
2
10
100

Java 數(shù)值排序模擬

import java.util.*;
import java.util.stream.Collectors;

public class NumericSortSimulator {
    public static void main(String[] args) {
        List<String> numberStrings = Arrays.asList("10", "2", "100", "1");

        System.out.println("=== 字符串排序 ===");
        List<String> lexSorted = new ArrayList<>(numberStrings);
        Collections.sort(lexSorted);
        lexSorted.forEach(System.out::println);

        System.out.println("\n=== 數(shù)值排序 ===");
        List<String> numSorted = numberStrings.stream()
            .sorted((a, b) -> Integer.compare(Integer.parseInt(a), Integer.parseInt(b)))
            .collect(Collectors.toList());
        numSorted.forEach(System.out::println);
    }
}

四、多列排序與字段分隔符:-k 與 -t

現(xiàn)實(shí)中的數(shù)據(jù)往往以結(jié)構(gòu)化形式存在,比如 CSV 或制表符分隔的日志。sort 支持按列排序:

# 示例數(shù)據(jù) scores.txt:
Alice 85 Math
Bob 92 Physics
Charlie 78 Chemistry
Diana 92 Math

# 按第二列(分?jǐn)?shù))數(shù)值排序
sort -k2 -n scores.txt

# 按第三列(科目)字典序排序,再按第二列數(shù)值排序
sort -k3,3 -k2,2n scores.txt

-k2,2n 表示“從第2列開始,到第2列結(jié)束,按數(shù)值排序”。若只寫 -k2,則從第2列開始直到行尾都參與排序。

使用自定義分隔符

# 如果是逗號(hào)分隔
echo -e "Alice,85,Math\nBob,92,Physics" | sort -t',' -k2 -n

五、mermaid 圖表:sort 處理流程示意

該流程圖清晰地展示了 sort 命令內(nèi)部處理邏輯,包括字段選擇、類型判斷、排序算法和去重步驟。

六、穩(wěn)定排序與內(nèi)存控制:-s 與 -S

默認(rèn)情況下,GNU sort 使用的是不穩(wěn)定排序——即相等元素的原始相對順序可能被打亂。若需保持原始順序,可加 -s

echo -e "B 2\nA 2\nC 1" | sort -k2 -n -s

輸出:

C 1
B 2
A 2   # B 在 A 前,保持了輸入順序

另外,大數(shù)據(jù)集排序可能占用大量內(nèi)存。可通過 -S 指定最大內(nèi)存用量:

sort -S 500M hugefile.txt

這在處理 GB 級日志文件時(shí)非常有用。

七、Java 實(shí)現(xiàn)多列排序與穩(wěn)定排序

Java 的 Comparator 鏈可以輕松模擬多列排序:

import java.util.*;

class Student {
    String name;
    int score;
    String subject;

    public Student(String name, int score, String subject) {
        this.name = name;
        this.score = score;
        this.subject = subject;
    }

    @Override
    public String toString() {
        return String.format("%s %d %s", name, score, subject);
    }
}

public class MultiColumnSort {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
            new Student("Alice", 85, "Math"),
            new Student("Bob", 92, "Physics"),
            new Student("Charlie", 78, "Chemistry"),
            new Student("Diana", 92, "Math")
        );

        System.out.println("=== 按科目排序,再按分?jǐn)?shù)排序 ===");
        students.sort(Comparator
            .comparing((Student s) -> s.subject)
            .thenComparingInt(s -> s.score));

        students.forEach(System.out::println);
    }
}

對于穩(wěn)定排序,Java 的 Collections.sort()List.sort() 默認(rèn)就是穩(wěn)定的,無需額外參數(shù)。

八、去重與合并:-u 與 comm 命令

sort -u 可用于去除相鄰重復(fù)行。注意:它只對已排序的數(shù)據(jù)有效,因?yàn)橹槐容^相鄰行。

echo -e "apple\nbanana\napple\ncherry" | sort -u

輸出:

apple
banana
cherry

若想找出兩個(gè)文件的交集、差集,可結(jié)合 comm 命令:

# 文件 a.txt: apple, banana, cherry
# 文件 b.txt: banana, date, elderberry

comm -12 <(sort a.txt) <(sort b.txt)  # 交集
comm -23 <(sort a.txt) <(sort b.txt)  # a 有而 b 無

九、國際化與區(qū)域設(shè)置:LC_COLLATE

sort 的排序行為受環(huán)境變量 LC_COLLATE 影響。不同語言環(huán)境下,字符排序規(guī)則可能不同:

# 查看當(dāng)前設(shè)置
echo $LC_COLLATE

# 臨時(shí)切換為 C 語言環(huán)境(ASCII 順序)
LC_COLLATE=C sort file.txt

# 切換為 UTF-8 環(huán)境(支持多語言)
LC_COLLATE=en_US.UTF-8 sort file.txt

在中文環(huán)境下,你可能會(huì)看到漢字按拼音排序,這取決于系統(tǒng)的 locale 配置。

十、性能優(yōu)化技巧:緩沖區(qū)、臨時(shí)目錄與并行

處理大文件時(shí),合理配置能顯著提升速度:

# 增大緩沖區(qū)
sort --buffer-size=1G bigfile.txt

# 指定臨時(shí)目錄(選高速磁盤)
sort --temporary-directory=/tmp bigfile.txt

# GNU sort 自動(dòng)多線程(版本 >= 8.24)
# 無需額外參數(shù),自動(dòng)檢測 CPU 核心數(shù)

如需手動(dòng)控制線程數(shù)(較新版本支持):

sort --parallel=4 huge.log

十一、Java 調(diào)用系統(tǒng) sort 命令(進(jìn)階)

有時(shí),直接調(diào)用系統(tǒng)命令比純 Java 實(shí)現(xiàn)更高效(尤其對大文件)。以下示例展示如何在 Java 中執(zhí)行 sort

import java.io.*;
import java.nio.file.*;

public class SystemSortInvoker {
    public static void sortFile(String inputFile, String outputFile) throws IOException {
        String command = String.format("sort -n -o %s %s", outputFile, inputFile);
        
        ProcessBuilder pb = new ProcessBuilder("bash", "-c", command);
        pb.redirectErrorStream(true); // 合并錯(cuò)誤流
        
        Process process = pb.start();
        
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }
        
        int exitCode = process.waitFor();
        if (exitCode == 0) {
            System.out.println("? 排序完成,輸出至: " + outputFile);
        } else {
            System.err.println("? 排序失敗,退出碼: " + exitCode);
        }
    }

    public static void main(String[] args) {
        try {
            sortFile("input.txt", "output_sorted.txt");
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

安全提示:生產(chǎn)環(huán)境中應(yīng)避免拼接用戶輸入到命令字符串,以防命令注入攻擊。建議使用 ProcessBuilder 的參數(shù)數(shù)組形式。

十二、實(shí)際應(yīng)用場景舉例

場景1:分析訪問日志,找出高頻IP

# access.log 格式:IP - - [時(shí)間] "請求" 狀態(tài)碼 ...
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

場景2:合并多個(gè) CSV 并去重

cat *.csv | sort -t',' -k1,1 -u > merged_unique.csv

場景3:按文件大小排序

ls -l | tail -n +2 | sort -k5 -n

十三、常見陷阱與調(diào)試技巧

陷阱1:空格與制表符混用

# 錯(cuò)誤:字段分隔符不一致
echo -e "A\t10\nB 20" | sort -t$'\t' -k2 -n  # 第二行無法正確分割

解決方法:統(tǒng)一使用相同分隔符,或預(yù)處理數(shù)據(jù)。

陷阱2:隱藏字符干擾

# 檢查不可見字符
cat -A file.txt  # 顯示 ^I(tab)、$ (換行) 等

陷阱3:locale 導(dǎo)致排序異常

# 強(qiáng)制使用 C locale 避免意外
LC_ALL=C sort file.txt

十四、與其他命令組合使用

sort 經(jīng)常與 uniq, cut, awk, grep 等配合使用:

# 找出出現(xiàn)次數(shù)最多的單詞
tr ' ' '\n' < document.txt | grep -v '^$' | sort | uniq -c | sort -nr | head

# 按域名統(tǒng)計(jì)郵箱數(shù)量
cut -d'@' -f2 emails.txt | sort | uniq -c | sort -nr

十五、mermaid 圖表:sort 在數(shù)據(jù)管道中的位置

此圖展示了 sort 在典型數(shù)據(jù)處理流水線中的核心地位——它通常位于中間環(huán)節(jié),為后續(xù)聚合或篩選提供有序輸入。

十六、擴(kuò)展閱讀與官方文檔

GNU Coreutils 官方手冊(含 sort)
https://www.gnu.org/software/coreutils/manual/

Linux 命令行與 Shell 腳本大全(在線版)
https://linuxcommand.org/lc3_man_pages/sort1.html

POSIX 標(biāo)準(zhǔn)中的 sort 規(guī)范
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html

這些資源提供了最權(quán)威、最完整的 sort 命令說明,適合深入研究底層實(shí)現(xiàn)和跨平臺(tái)兼容性。

十七、Java 8+ 流式排序進(jìn)階

借助 Java Stream API,我們可以寫出更函數(shù)式的排序代碼:

import java.util.*;
import java.util.stream.Collectors;

public class StreamBasedSorter {
    public static void main(String[] args) {
        List<String> data = Arrays.asList(
            "user3,age:25,country:US",
            "user1,age:30,country:CN",
            "user2,age:25,country:JP"
        );

        // 解析并排序:先按年齡,再按國家
        List<String> sorted = data.stream()
            .map(line -> line.split(","))
            .sorted(Comparator
                .comparing(parts -> Integer.parseInt(parts[1].split(":")[1]))
                .thenComparing(parts -> parts[2].split(":")[1])
            )
            .map(parts -> String.join(",", parts))
            .collect(Collectors.toList());

        sorted.forEach(System.out::println);
    }
}

這種風(fēng)格更貼近現(xiàn)代 Java 開發(fā)習(xí)慣,也更容易與過濾、映射等操作組合。

十八、自定義排序規(guī)則:從簡單到復(fù)雜

有時(shí)默認(rèn)規(guī)則不夠用,比如版本號(hào)排序:

# 版本號(hào):期望 1.10 > 1.2,但字典序下 1.2 > 1.10
echo -e "1.2\n1.10\n1.1" | sort -V  # 使用版本號(hào)感知排序

-V 是 GNU sort 特有的“自然版本排序”選項(xiàng)。

Java 實(shí)現(xiàn)版本號(hào)排序

import java.util.*;
import java.util.regex.Pattern;

public class VersionSorter {
    private static List<Integer> parseVersion(String v) {
        return Pattern.compile("\\.")
            .splitAsStream(v)
            .map(Integer::parseInt)
            .collect(Collectors.toList());
    }

    public static void main(String[] args) {
        List<String> versions = Arrays.asList("1.2", "1.10", "1.1", "2.0");

        versions.sort(Comparator.comparing(VersionSorter::parseVersion));

        versions.forEach(System.out::println);
    }
}

十九、實(shí)戰(zhàn):構(gòu)建一個(gè)日志分析工具

假設(shè)我們要分析 Nginx 日志,找出訪問量最高的 URL:

# 假設(shè)日志格式:IP - - [時(shí)間] "GET /path HTTP/1.1" 狀態(tài)碼 大小 ...
awk '{print $7}' access.log \
  | grep -v '^\-$' \
  | sort \
  | uniq -c \
  | sort -nr \
  | head -20

用 Java 實(shí)現(xiàn)同樣功能:

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;

public class LogAnalyzer {
    public static void analyzeTopUrls(String logFile) throws IOException {
        Map<String, Long> urlCount = new HashMap<>();

        try (BufferedReader br = Files.newBufferedReader(Paths.get(logFile))) {
            br.lines()
              .map(line -> {
                  String[] parts = line.split(" ");
                  return parts.length > 6 ? parts[6] : "-";
              })
              .filter(url -> !"-".equals(url))
              .forEach(url -> urlCount.merge(url, 1L, Long::sum));
        }

        urlCount.entrySet().stream()
            .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
            .limit(20)
            .forEach(entry -> 
                System.out.printf("%5d %s%n", entry.getValue(), entry.getKey()));
    }

    public static void main(String[] args) throws IOException {
        analyzeTopUrls("access.log");
    }
}

二十、總結(jié)與最佳實(shí)踐

經(jīng)過前面近 8000 字的詳細(xì)講解,我們系統(tǒng)學(xué)習(xí)了 sort 命令的方方面面。以下是關(guān)鍵要點(diǎn)總結(jié):

?? 基礎(chǔ)必會(huì)sort file、sort -n、sort -rsort -u
?? 進(jìn)階技巧-k 多列排序、-t 自定義分隔符、-s 穩(wěn)定排序
?? 性能優(yōu)化-S 控制內(nèi)存、--parallel 并行處理、--temporary-directory 指定臨時(shí)路徑
?? 避坑指南:注意 locale 影響、檢查隱藏字符、確保分隔符一致
?? Java 對照:用 Comparator 鏈模擬多列排序,用 ProcessBuilder 調(diào)用系統(tǒng)命令
?? 組合使用:與 uniq、awk、cut 等命令配合構(gòu)建數(shù)據(jù)處理流水線

無論你是系統(tǒng)管理員、數(shù)據(jù)分析師還是 Java 開發(fā)者,掌握 sort 命令都能讓你在文本處理任務(wù)中游刃有余。記?。?strong>“在 Unix 世界里,有序即是力量。” 

以上就是Linux使用sort命令進(jìn)行文本排序的實(shí)操指南的詳細(xì)內(nèi)容,更多關(guān)于Linux sort命令文本排序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Linux默認(rèn)SUID可執(zhí)行文件詳解

    Linux默認(rèn)SUID可執(zhí)行文件詳解

    在 Linux 權(quán)限體系中,SUID是一種特殊權(quán)限位,當(dāng)一個(gè)程序被設(shè)置了 SUID 位后,任何用戶執(zhí)行該程序時(shí),程序都會(huì)以文件所有者的身份運(yùn)行,而非執(zhí)行者的身份,本文給大家詳細(xì)介紹了Linux默認(rèn)SUID可執(zhí)行文件,需要的朋友可以參考下
    2026-05-05
  • Linux系統(tǒng)查看CPU、機(jī)器型號(hào)、內(nèi)存等信息

    Linux系統(tǒng)查看CPU、機(jī)器型號(hào)、內(nèi)存等信息

    今天小編就為大家分享一篇關(guān)于Linux系統(tǒng)查看CPU、機(jī)器型號(hào)、內(nèi)存等信息,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • tr命令在統(tǒng)計(jì)英文單詞出現(xiàn)頻率中的妙用

    tr命令在統(tǒng)計(jì)英文單詞出現(xiàn)頻率中的妙用

    今天小編就為大家分享一篇關(guān)于tr命令在統(tǒng)計(jì)英文單詞出現(xiàn)頻率中的妙用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Linux下如何查看系統(tǒng)運(yùn)行

    Linux下如何查看系統(tǒng)運(yùn)行

    在Linux下,可以通過查看/proc/cpuinfo文件來了解CPU的信息,如physicalid代表CPU編號(hào),cpucores代表核心數(shù),也可以使用uptime或top命令來評估系統(tǒng)的整體性能,特別是loadaverage的值,它反映了系統(tǒng)的負(fù)載情況
    2026-03-03
  • 詳解linux中nginx啟動(dòng) 重啟 關(guān)閉命令

    詳解linux中nginx啟動(dòng) 重啟 關(guān)閉命令

    本篇文章主要介紹了詳解linux中nginx啟動(dòng) 重啟 關(guān)閉命令,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Linux后臺(tái)運(yùn)行Java應(yīng)用的兩種方式詳解

    Linux后臺(tái)運(yùn)行Java應(yīng)用的兩種方式詳解

    在現(xiàn)代軟件開發(fā)和運(yùn)維實(shí)踐中,將 Java 應(yīng)用部署到 Linux 服務(wù)器并使其穩(wěn)定、可靠地在后臺(tái)運(yùn)行是每個(gè)開發(fā)者和系統(tǒng)管理員必須掌握的核心技能,本文將深入探討兩種主流的 Linux 后臺(tái)運(yùn)行 Java 應(yīng)用的方式,需要的朋友可以參考下
    2026-03-03
  • Apache?Doris?中Compaction問題分析和典型案例分析

    Apache?Doris?中Compaction問題分析和典型案例分析

    這篇文章主要介紹了Apache?Doris?中Compaction問題分析和典型案例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-08-08
  • 詳解Linux下Tomcat開啟查看GC信息

    詳解Linux下Tomcat開啟查看GC信息

    這篇文章主要介紹了詳解Linux下Tomcat開啟查看GC信息,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Linux網(wǎng)絡(luò)配置與端口監(jiān)聽的實(shí)戰(zhàn)指南

    Linux網(wǎng)絡(luò)配置與端口監(jiān)聽的實(shí)戰(zhàn)指南

    做開發(fā)和運(yùn)維的同學(xué),幾乎每天都會(huì)和網(wǎng)絡(luò)打交道:部署服務(wù)后端口不通、服務(wù)器IP配置異常、接口調(diào)用失敗、防火墻攔截請求,所以本文匯總了IP查看、DNS配置、端口監(jiān)聽、連通性測試、防火墻放行的實(shí)操技巧,需要的朋友可以參考下
    2026-02-02
  • Centos系統(tǒng)服務(wù)器查看端口是否開放的方法

    Centos系統(tǒng)服務(wù)器查看端口是否開放的方法

    本文介紹了在Centos系統(tǒng)服務(wù)器上如何查看端口是否開放的方法,通過telnet命令可以輕松實(shí)現(xiàn)。這對于服務(wù)器管理員來說非常重要,可以幫助他們及時(shí)發(fā)現(xiàn)端口問題并進(jìn)行修復(fù)。
    2023-03-03

最新評論

禹州市| 西平县| 安义县| 金寨县| 武宁县| 扶余县| 昌黎县| 都安| 清河县| 拉孜县| 高青县| 台安县| 南木林县| 长汀县| 西青区| 渑池县| 江阴市| 荔波县| 余姚市| 舞阳县| 双峰县| 玉溪市| 平陆县| 交城县| 金昌市| 历史| 鱼台县| 时尚| 蕲春县| 信宜市| 临海市| 新沂市| 深圳市| 漳州市| 海门市| 南康市| 罗城| 老河口市| 偃师市| 晋中市| 肃宁县|