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

從基礎(chǔ)到高階詳解Linux?Shell文件去重的完整指南

 更新時(shí)間:2026年04月21日 09:29:08   作者:君九@DBA  
在日常開發(fā)和運(yùn)維工作中,我們經(jīng)常會(huì)遇到文件內(nèi)容重復(fù)的場(chǎng)景,本文將從「基礎(chǔ)去重」到「高階實(shí)戰(zhàn)」,系統(tǒng)講解?Linux?Shell?中文件去重的核心方法,,同時(shí)深入原理分析和性能對(duì)比,幫助你根據(jù)實(shí)際場(chǎng)景選擇最優(yōu)方案

在日常開發(fā)和運(yùn)維工作中,我們經(jīng)常會(huì)遇到文件內(nèi)容重復(fù)的場(chǎng)景——比如日志合并后存在大量重復(fù)條目、數(shù)據(jù)采集時(shí)出現(xiàn)冗余記錄、文本處理后殘留重復(fù)行等。手動(dòng)去重效率低下且容易出錯(cuò),而 Linux Shell 提供了多種高效的去重工具和技巧,能夠輕松應(yīng)對(duì)不同場(chǎng)景下的文件去重需求。

本文將從「基礎(chǔ)去重」到「高階實(shí)戰(zhàn)」,系統(tǒng)講解 Linux Shell 中文件去重的核心方法,包括 sort+uniq 組合、awk 高級(jí)去重、sed 精準(zhǔn)去重等,同時(shí)深入原理分析和性能對(duì)比,幫助你根據(jù)實(shí)際場(chǎng)景選擇最優(yōu)方案。

一、基礎(chǔ)去重:sort + uniq 組合(最常用)

1.1 核心原理

uniq 是 Linux 內(nèi)置的去重命令,但其僅能去除相鄰的重復(fù)行(底層原理:逐行讀取文件,與上一行內(nèi)容對(duì)比,相同則跳過,不同則輸出并更新“上一行緩存”)。因此,直接使用 uniq 無法處理非相鄰重復(fù)行,必須先通過 sort 命令將文件內(nèi)容排序,使重復(fù)行相鄰,再用 uniq 去重。

1.2 基本用法

場(chǎng)景 1:簡(jiǎn)單去重(保留首次出現(xiàn)的行)

# 語(yǔ)法:sort 文件名 | uniq
sort data.txt | uniq

示例:data.txt 原始內(nèi)容

apple
banana
apple
orange
banana

執(zhí)行結(jié)果(去重后并排序)

apple
banana
orange

場(chǎng)景 2:統(tǒng)計(jì)重復(fù)次數(shù)(去重并顯示計(jì)數(shù))

sort data.txt | uniq -c

輸出結(jié)果(前綴為重復(fù)次數(shù))

      2 apple
      2 banana
      1 orange

場(chǎng)景 3:只保留重復(fù)行(篩選重復(fù)數(shù)據(jù))

sort data.txt | uniq -d

輸出結(jié)果(僅顯示出現(xiàn)次數(shù) ≥2 的行)

apple
banana

場(chǎng)景 4:只保留不重復(fù)行(篩選唯一數(shù)據(jù))

sort data.txt | uniq -u

輸出結(jié)果(僅顯示出現(xiàn)次數(shù) =1 的行)

orange

1.3 關(guān)鍵參數(shù)詳解

參數(shù)作用示例
-c顯示每行的重復(fù)次數(shù)`sort data.txt
-d僅顯示重復(fù)出現(xiàn)的行(次數(shù) ≥2)`sort data.txt
-u僅顯示不重復(fù)的行(次數(shù) =1)`sort data.txt
-i忽略大小寫差異(如 Apple 和 apple 視為重復(fù))`sort data.txt
-f N忽略前 N 個(gè)字段的差異(字段以空格分隔)`sort data.txt
-s N忽略前 N 個(gè)字符的差異`sort data.txt

1.4 注意事項(xiàng)

  1. 必須先排序uniq 僅對(duì)比相鄰行,未排序的文件直接使用 uniq 會(huì)導(dǎo)致去重不徹底(如上述示例中直接 uniq data.txt 無法去除非相鄰的 applebanana)。
  2. 空白行處理uniq 會(huì)將空白行視為相同內(nèi)容,如需保留空白行可結(jié)合 grep 過濾:sort data.txt | grep -v '^$' | uniq(先去除空白行再去重)。
  3. 性能考量sort 命令的時(shí)間復(fù)雜度為 O(n log n),對(duì)于超大文件(GB 級(jí)),需結(jié)合后續(xù)高階方法優(yōu)化。

二、高階去重:awk 命令(靈活處理復(fù)雜場(chǎng)景)

sort+uniq 適合簡(jiǎn)單的全行去重,但在實(shí)際工作中,我們常遇到「部分字段去重」「保留最后一次出現(xiàn)的行」「按條件去重」等復(fù)雜需求,此時(shí) awk 命令的靈活性優(yōu)勢(shì)凸顯。

2.1 核心原理

awk 基于「關(guān)聯(lián)數(shù)組」(鍵值對(duì))實(shí)現(xiàn)去重:將需要去重的字段作為數(shù)組的鍵,遍歷文件時(shí)判斷鍵是否存在——存在則跳過(或覆蓋),不存在則存儲(chǔ)并輸出。無需提前排序,支持自定義去重邏輯。

2.2 典型場(chǎng)景實(shí)戰(zhàn)

場(chǎng)景 1:部分字段去重(保留首次出現(xiàn)的行)

假設(shè) user.txt 內(nèi)容如下(第一列為用戶 ID,第二列為用戶名),需按用戶 ID 去重(相同 ID 僅保留首次出現(xiàn)的行):

101 Alice
102 Bob
101 Charlie
103 Dave
102 Eve

命令:

awk '!a[$1]++' user.txt

輸出結(jié)果(按 ID 去重,保留首次出現(xiàn)的行):

101 Alice
102 Bob
103 Dave

原理解析:

  • $1 表示第一列(用戶 ID),作為關(guān)聯(lián)數(shù)組 a 的鍵。
  • a[$1]++ 表示數(shù)組值自增(初始為 0,首次訪問后變?yōu)?1)。
  • !a[$1] 表示當(dāng)數(shù)組值為 0 時(shí)(首次出現(xiàn)),條件為真,執(zhí)行默認(rèn)操作(輸出當(dāng)前行)。

場(chǎng)景 2:部分字段去重(保留最后一次出現(xiàn)的行)

延續(xù)上述場(chǎng)景,需按用戶 ID 去重,保留最后一次出現(xiàn)的行:

命令:

awk '{a[$1]=$0} END{for(k in a) print a[k]}' user.txt

輸出結(jié)果:

101 Charlie
102 Eve
103 Dave

原理解析:

  • 遍歷文件時(shí),用數(shù)組 a 存儲(chǔ)每個(gè) ID 對(duì)應(yīng)的最新行(重復(fù) ID 會(huì)覆蓋之前的值)。
  • END 塊在文件遍歷結(jié)束后執(zhí)行,遍歷數(shù)組并輸出所有鍵對(duì)應(yīng)的行(順序不固定,如需排序可追加 | sort)。

場(chǎng)景 3:全行去重(無需排序,保留首次出現(xiàn))

sort+uniq 功能一致,但無需排序,效率更高(時(shí)間復(fù)雜度 O(n)):

awk '!a[$0]++' data.txt

輸出結(jié)果(保留首次出現(xiàn)的行,順序與原文件一致):

apple
banana
orange

場(chǎng)景 4:按條件去重(如過濾特定字符后去重)

假設(shè) log.txt 內(nèi)容如下(需按日志時(shí)間戳去重,忽略后面的詳細(xì)信息):

2024-05-01 10:00:00 [INFO] 用戶登錄
2024-05-01 10:00:00 [ERROR] 數(shù)據(jù)庫(kù)連接失敗
2024-05-01 10:01:00 [INFO] 數(shù)據(jù)查詢成功

命令(按前 19 個(gè)字符(時(shí)間戳)去重,保留首次出現(xiàn)的行):

awk '!a[substr($0,1,19)]++' log.txt

輸出結(jié)果:

2024-05-01 10:00:00 [INFO] 用戶登錄
2024-05-01 10:01:00 [INFO] 數(shù)據(jù)查詢成功

原理:substr($0,1,19) 截取每行前 19 個(gè)字符(時(shí)間戳部分)作為數(shù)組鍵,實(shí)現(xiàn)按時(shí)間戳去重。

2.3 awk 去重的優(yōu)勢(shì)

  1. 無需排序:直接遍歷文件一次即可完成去重,效率高于 sort+uniq(尤其對(duì)于超大文件)。
  2. 靈活定制:支持按任意字段、字符長(zhǎng)度、正則表達(dá)式等條件去重,滿足復(fù)雜場(chǎng)景需求。
  3. 保留原始順序:默認(rèn)保留首次出現(xiàn)的行的順序,而 sort+uniq 會(huì)改變行的順序(除非后續(xù)再排序回原始順序,操作繁瑣)。

三、精準(zhǔn)去重:sed 命令(適合小規(guī)模文件)

sed 是流式文本編輯器,通過正則表達(dá)式匹配和替換實(shí)現(xiàn)去重,適合小規(guī)模文件或簡(jiǎn)單的去重場(chǎng)景(性能略遜于 awk,但語(yǔ)法簡(jiǎn)潔)。

3.1 核心原理

利用 sed 的「保持空間(hold space)」和「模式空間(pattern space)」,將已處理的行存儲(chǔ)在保持空間中,遍歷每行時(shí)與保持空間中的內(nèi)容對(duì)比,若存在則刪除,不存在則添加到保持空間并輸出。

3.2 基本用法

場(chǎng)景:全行去重(保留首次出現(xiàn)的行,順序不變)

sed -n ':a; /^\n*$/!{H;g;s/\n//g;/:$/!s/$/:/;s/:[^:]*\(\1\)/:\1/;t b;g}; p; :b; s/:$//;h;$p' data.txt

簡(jiǎn)化版本(適合無特殊字符的文件):

sed '$!N; /^\(.*\)\n\1$/!P; D' data.txt

示例:data.txt 原始內(nèi)容

apple
banana
apple
orange
banana

輸出結(jié)果(保留首次出現(xiàn)的行,順序不變):

apple
banana
orange

3.3 注意事項(xiàng)

  1. sed 去重語(yǔ)法較復(fù)雜,尤其對(duì)于部分字段去重場(chǎng)景,不如 awk 靈活。
  2. 適合小規(guī)模文件(幾 MB 以內(nèi)),大規(guī)模文件建議使用 awksort+uniq。

四、性能對(duì)比與場(chǎng)景選擇

4.1 三種方法性能對(duì)比(基于 1GB 文本文件,1000 萬行數(shù)據(jù))

方法時(shí)間復(fù)雜度執(zhí)行時(shí)間優(yōu)勢(shì)場(chǎng)景
sort+uniqO(n log n)約 30 秒需排序、統(tǒng)計(jì)重復(fù)次數(shù)、簡(jiǎn)單全行去重
awkO(n)約 10 秒無需排序、部分字段去重、保留原始順序
sedO(n²)約 120 秒小規(guī)模文件、簡(jiǎn)單全行去重

4.2 場(chǎng)景選擇建議

  1. 簡(jiǎn)單全行去重且需排序:優(yōu)先使用 sort+uniq(語(yǔ)法簡(jiǎn)潔,易上手)。
  2. 復(fù)雜場(chǎng)景(部分字段、保留最后一次出現(xiàn)、無需排序):優(yōu)先使用 awk(靈活高效)。
  3. 小規(guī)模文件、臨時(shí)快速去重:可使用 sed(無需記憶復(fù)雜語(yǔ)法,適合應(yīng)急)。
  4. 超大文件(10GB+):推薦 awksort --parallel=4 uniqsort--parallel 參數(shù)開啟多線程加速)。

五、實(shí)戰(zhàn)案例:日志文件去重與分析

假設(shè)我們有一個(gè) Nginx 訪問日志 access.log,內(nèi)容如下(部分行):

192.168.1.1 - - [01/May/2024:10:00:00 +0800] "GET /index.html HTTP/1.1" 200 1024
192.168.1.2 - - [01/May/2024:10:00:01 +0800] "POST /login HTTP/1.1" 401 512
192.168.1.1 - - [01/May/2024:10:00:02 +0800] "GET /index.html HTTP/1.1" 200 1024
192.168.1.3 - - [01/May/2024:10:00:03 +0800] "GET /api/data HTTP/1.1" 200 2048
192.168.1.1 - - [01/May/2024:10:00:04 +0800] "GET /index.html HTTP/1.1" 200 1024

需求 1:按 IP 去重,統(tǒng)計(jì)每個(gè) IP 的訪問次數(shù)

awk '{print $1}' access.log | sort | uniq -c | sort -nr

輸出結(jié)果(按訪問次數(shù)降序排列):

      3 192.168.1.1
      1 192.168.1.2
      1 192.168.1.3

需求 2:按 URL 去重,保留每個(gè) URL 最后一次訪問的日志

awk '{url=$7; a[url]=$0} END{for(k in a) print a[k]}' access.log | sort -k4

輸出結(jié)果(按時(shí)間戳排序,保留每個(gè) URL 最后一次訪問記錄):

192.168.1.2 - - [01/May/2024:10:00:01 +0800] "POST /login HTTP/1.1" 401 512
192.168.1.1 - - [01/May/2024:10:00:04 +0800] "GET /index.html HTTP/1.1" 200 1024
192.168.1.3 - - [01/May/2024:10:00:03 +0800] "GET /api/data HTTP/1.1" 200 2048

需求 3:去除重復(fù)的成功訪問日志(狀態(tài)碼 200),保留首次出現(xiàn)的行

awk '$9==200 && !a[$1$7]++' access.log

輸出結(jié)果(按 IP+URL 去重,僅保留首次成功訪問的日志):

192.168.1.1 - - [01/May/2024:10:00:00 +0800] "GET /index.html HTTP/1.1" 200 1024
192.168.1.3 - - [01/May/2024:10:00:03 +0800] "GET /api/data HTTP/1.1" 200 2048

六、總結(jié)

Linux Shell 提供了多種文件去重方案,核心可分為三類:

  1. sort+uniq:基礎(chǔ)通用,適合簡(jiǎn)單全行去重、統(tǒng)計(jì)重復(fù)次數(shù),需排序支持。
  2. awk:高階靈活,適合復(fù)雜場(chǎng)景(部分字段、保留特定行、無需排序),效率高。
  3. sed:簡(jiǎn)潔輕便,適合小規(guī)模文件和臨時(shí)去重需求。

到此這篇關(guān)于從基礎(chǔ)到高階詳解Linux Shell文件去重的完整指南的文章就介紹到這了,更多相關(guān)Shell文件去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux查看磁盤信息的命令詳解

    Linux查看磁盤信息的命令詳解

    這篇文章主要介紹了Linux查看磁盤信息的命令,df與du命令,df 命令主要用于需要檢查文件系統(tǒng)上已使用和可用的磁盤空間的數(shù)量,du命令主要用于需要了解系統(tǒng)上的目錄或文件所使用的磁盤空間量,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-04-04
  • Linux Shell echo命令輸出格式詳解

    Linux Shell echo命令輸出格式詳解

    本文介紹了echo命令的用法,包括基本輸出、換行控制、轉(zhuǎn)義字符處理、字體及背景顏色設(shè)置等選項(xiàng),并說明了常用參數(shù)和特殊效果的實(shí)現(xiàn)方法
    2025-10-10
  • 自動(dòng)重啟服務(wù)的shell腳本代碼

    自動(dòng)重啟服務(wù)的shell腳本代碼

    公司tomcat服務(wù)器有個(gè)過一段時(shí)間自動(dòng)會(huì)掛的bug一直沒能解決,掛的時(shí)候還要手動(dòng)重啟tomcat,于是決定寫個(gè)腳本讓它定時(shí)檢測(cè)故障自動(dòng)重啟吧
    2013-06-06
  • shell編程基礎(chǔ)知識(shí)小結(jié)

    shell編程基礎(chǔ)知識(shí)小結(jié)

    這篇文章主要介紹了shell編程基礎(chǔ)知識(shí),包括文件類型、正則表達(dá)式、字符類、引號(hào)類型、變量設(shè)置、條件測(cè)試、命令執(zhí)行順序、腳本調(diào)試方面的介紹
    2013-02-02
  • Linux下Tomcat啟動(dòng)正常,但瀏覽器無法訪問的解決方法

    Linux下Tomcat啟動(dòng)正常,但瀏覽器無法訪問的解決方法

    下面小編就為大家?guī)硪黄狶inux下Tomcat啟動(dòng)正常,但瀏覽器無法訪問的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Linux命令之ps命令使用詳解

    Linux命令之ps命令使用詳解

    這篇文章主要給大家介紹Linux命令之ps命令使用方法,文中有詳細(xì)的代碼示例,對(duì)我們學(xué)習(xí)Linux命令有一定的幫助,感興趣的同學(xué)可以參考閱讀下
    2023-06-06
  • shell讀取配置文件的方式sed命令詳解

    shell讀取配置文件的方式sed命令詳解

    在編寫啟動(dòng)腳本時(shí),涉及到讀取配置文件,特地記錄下shell腳本讀取啟動(dòng)文件的方式,這篇文章主要介紹了shell讀取配置文件-sed命令,需要的朋友可以參考下
    2023-04-04
  • linux?shell文件轉(zhuǎn)碼iconv命令的使用

    linux?shell文件轉(zhuǎn)碼iconv命令的使用

    本文主要介紹了linux?shell文件轉(zhuǎn)碼iconv命令的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 分享shell編程中的幾個(gè)小技巧

    分享shell編程中的幾個(gè)小技巧

    分享shell編程中的幾個(gè)小技巧,學(xué)習(xí)shell編程的朋友可以看下
    2013-02-02
  • Shell腳本實(shí)現(xiàn)硬盤空間和表空間的使用情況統(tǒng)計(jì)并郵件通知

    Shell腳本實(shí)現(xiàn)硬盤空間和表空間的使用情況統(tǒng)計(jì)并郵件通知

    這篇文章主要介紹了Shell腳本實(shí)現(xiàn)硬盤空間和表空間的使用情況統(tǒng)計(jì)并郵件通知,其中表空間是指oracle數(shù)據(jù)庫(kù)里的表空間,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

齐齐哈尔市| 兴宁市| 贵溪市| 九江市| 安平县| 陆川县| 巧家县| 同江市| 厦门市| 长寿区| 临沭县| 洛阳市| 祁东县| 怀柔区| 浦东新区| 南岸区| 镇平县| 当雄县| 泾川县| 外汇| 鄂托克旗| 平阴县| 崇左市| 黑龙江省| 营口市| 平南县| 三明市| 绥中县| 衡阳县| 大宁县| 鹤山市| 阳泉市| 偃师市| 芮城县| 松潘县| 青浦区| 邹城市| 乌鲁木齐县| 扶绥县| 昂仁县| 叶城县|