shell文件排序、去重、合併、分割

1、文件排序
    sort file    html

    排序選項:測試

        -b, --ignore-leading-blanks 忽略前導的空白區域日誌

        -d, --dictionary-order 只考慮空白區域和字母字符htm

        -f, --ignore-case 忽略字母大小寫blog

        -g, --general-numeric-sort 按照常規數值排序排序

        -i, --ignore-nonprinting 只排序可打印字符ip

        -n, --numeric-sort 根據字符串數值比較內存

        -r, --reverse 逆序輸出排序結果字符串

 

2、兩個文件的交集,並集it

    前提條件:每一個文件中不得有重複行

        一、取出兩個文件的並集(重複的行只保留一份) 

                cat file1 file2 | sort | uniq > file3

        二、取出兩個文件的交集(只留下同時存在於兩個文件中的文件)

                cat file1 file2 | sort | uniq -d > file3

        三、刪除交集,留下其餘的行

                cat file1 file2 | sort | uniq -u > file3

3、兩個文件合併

    一個文件在上,一個文件在下

        cat file1 file2 > file3

    一個文件在左,一個文件在右

        paste file1 file2 > file3

4、一個文件去掉重複的行:

    sort file |uniq

        注意:重複的多行記爲一行,也就是說這些重複的行還在,只是所有省略爲一行!

    sort file |uniq -u

        上面的命令能夠把重複的行所有去掉,也就是文件中的非重複行!

    具體細節能夠查看,cat,sort,uniq等命令的詳細介紹

5、將一個大的文件分割成多個小文件:

    採用一個50M大小的日誌文件進行測試。日誌文件名:log.txt.gz。文件行數:208363

    方法一、(split分割)

        語法:split [-<行數>][-b <字節>][-C <字節>][-l <行數>][要切割的文件][輸出文件名]

        # gunzip log.txt.gz             //必定要先解壓,不然分割的文件是不能cat/zcat顯示;

        # wc -l log.txt                 //計算一個文件的總行數;

        208363 log.txt

        # split -l 120000 log.txt newlog    //經過指定行數,將日誌分割成兩個文件;

        # du -sh *50M     log.txt

        29M     newlogaa

        22M     newlogab

        # file *                         //分割後的文件與原文件屬性同樣

        log.txt: ASCII text, with very long lines, with CRLF line terminators

        newlogaa: ASCII text, with very long lines, with CRLF line terminators

        newlogab: ASCII text, with very long lines, with CRLF line terminators

        # gzip newlogaa newlogab         //將分割後的文件進行壓縮,以便傳輸

 

方法二、(dd分割)

        # gunzip log.txt.gz             //必定要先解壓,不然分割的文件是不能cat/zcat顯示;

#dd bs=20480 count=1500 if=log.txt of=newlogaa      //按大小分第一個文件

#dd bs=20480 count=1500 if=log.txt of=newlogab skip=1500  //將大小以後的生成另外一個文件#file *

log.txt: ASCII text, with very long lines, with CRLF line terminators
newlogaa: ASCII text, with very long lines, with CRLF line terminators
newlogab: ASCII text, with very long lines, with CRLF line terminators

 

分割沒問題,但會出現同一行分到不一樣文件的狀況,除非你以及日誌分析系統能夠「容忍」。

 

方法3:(head+tail 分割)

    #gzip log.txt.gz               //如不解壓縮,下面請用zcat。

    #wc -l log.txt                //統計一個行數

    208363 log.txt

    # head -n `echo $((208363/2+1))` log.txt > newloga.txt      //前x行重定向輸出到一個文件中;

    #tail –n `echo $((208363-208362/2-1))` log.txt >newlogb.txt //後x行重定向輸出到一個文件中;

    #gzip newloga.txt newlogb.txt          //將兩個文件進行壓縮

方法四、(awk分割)

    #gzip log.txt.gz#awk ‘{if (NR<120000) print $0}’ log.txt >newloga.txt#awk ‘{if (NR>=120000) print $0}’ log.txt >newlogb.txt

 

    以上兩個命令,都要遍歷整個文件,因此考慮到效率,應使用合併成:

    #awk ‘{if (NR<120000) print $0 >」newloga.txt」;if (NR>=120000) print $0>」newlogb.txt」}’ log.txt

 

以上四種方法,除了dd以外的三種方式均可以很好的整行分割日誌文件。進行分割時,應考慮在讀一次文件的同時完成,如否則,按下面的方式分割:

        Cat log.txt| head –12000 >newloga.txt

        Cat log.txt | tail –23000 >newlogb.txt

如用此方法分割文件的後一部分,那麼執行第二行命令文件時,前x行是白白讀一遍的,執行的效率將不好,如文件過大,還可能出現內存不夠的狀況。

 

 

參考:https://www.cnblogs.com/kakaisgood/p/7686284.html

相關文章
相關標籤/搜索