<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0

    一個大型文件(總之不小),要求刪除該文件的最后一行,求一種效率比較高的解決方法。

    測試用的文本文件800M
    1.用sed解決,此法最易想,但也是最笨的一個,
    解決方法來自問題的提出者:
    sed -e '$d' input.file > output.file
    用time測試了一下,效率是相當的低!
    real    2m51.099s
    user    2m1.268s
    sys    0m4.260s
    2.用head解決,此法比sed有一個質的的提升,提升來自增大了緩存,不過依然沒有抓住問題的本質,還是做了不少無用功!解決方法來時cu上的熱心網友。
    head -n-1 input.file > output.file
    real    0m23.687s
    user    0m0.212s
    sys    0m4.668s
    3.用vim解決,此法很別處心裁,這應該是遇到這個問題的最先想到的一種。解決方法來自我加的unix like群里的一個叫石仔的管理員!
    vim + result
    dd
    這個沒測試,感覺效率和head法差不多,加載太慢!
    4.重量級要到場了,感謝cu版主的這個腳本,只能用四個字形容!五體投地!
    :|dd of=input.file seek=1 bs=$(($(find input.file -printf "%s")-$(tail -1 input.file|wc -c)))
    或者是
    :|dd of=input.file seek=1 bs=$(($(stat -c%s input.file)-$(tail -1 input.file|wc -c)))
    測試了一下!
    real    0m0.123s
    user    0m0.004s
    sys    0m0.012s
    5.感覺這個用c寫效率最高,但顯然,代碼也是最長的,我實現了代碼,
    測試了一下,
    real    0m0.002s
    user    0m0.000s
    sys    0m0.000s
    代碼如下:

    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <stdlib.h>

    #define GUESS_LINE_SIZE 80
    int get_line_size(char *ptr);

    int
    main(int argc, char *argv[])
    {
        char buf[GUESS_LINE_SIZE];
        int line_len, fd;
        struct stat stat_buf;
       
        fd = open(argv[1], O_RDWR);
        lstat(argv[1], &stat_buf);
        lseek(fd, -GUESS_LINE_SIZE, SEEK_END);
        read(fd, buf, GUESS_LINE_SIZE) ;
        line_len = get_line_size(buf);
        truncate(argv[1], stat_buf.st_size - line_len);
       
        exit(0);
    }

    int
    get_line_size(char *ptr)
    {
        int line_len = 0, i = GUESS_LINE_SIZE - 2;/*buf中的最后一個字符為'\n'*/
       
        while (*(ptr + i) != '\n') {
            //printf("%c", *(ptr + i));

            i--;
            line_len++;
        }
        return line_len;
    }

    posted on 2010-04-21 18:45 xzc 閱讀(3289) 評論(2)  編輯  收藏 所屬分類: linux/unix

    評論:
    # re: 高效率刪除文本文件的最后一行 2010-04-21 18:48 | xzc
    :|dd of=input.file seek=1 bs=$(($(stat -c%s input.file)-$(tail -1 input.file|wc -c)))
    或者改為這樣更好理解:
    dd if=/dev/null of=input.file seek=1 bs=$(($(find input.file -printf "%s")-$(tail -1 input.file|wc -c)))
    也就是說:|的輸出是空字符串,而其作用正好與/dev/null相似。  回復  更多評論
      
    # re: 高效率刪除文本文件的最后一行 2010-04-22 11:02 | xzc
    文件行數
    cat DAPMmxdata004.20100421.201003.0001.771|wc -l  回復  更多評論
      
    主站蜘蛛池模板: 中文字幕免费在线看线人 | 免费人成网站在线观看10分钟| 亚洲av永久无码精品三区在线4| 免费无遮挡无码视频网站| 一级特黄录像免费播放中文版| 亚洲AV无码久久寂寞少妇| 无限动漫网在线观看免费| 国产偷国产偷亚洲高清在线| 亚洲女同成av人片在线观看| 无遮免费网站在线入口| 男女作爱免费网站| 亚洲五月激情综合图片区| 热99re久久免费视精品频软件| 中文字幕免费播放| 亚洲中文字幕一二三四区| 久久精品亚洲福利| 韩国免费一级成人毛片| 国产免费区在线观看十分钟| 99999久久久久久亚洲| 亚洲国产精品无码av| 国产极品粉嫩泬免费观看| 亚洲视频免费在线观看| 免费很黄无遮挡的视频毛片| 亚洲成亚洲乱码一二三四区软件| 免费无码AV电影在线观看| 四虎国产精品永免费| 亚洲成AV人片一区二区密柚| 国产小视频免费观看| 国产一区二区三区免费| 亚洲日韩一区二区一无码| 亚洲精品午夜无码电影网| 无码人妻久久一区二区三区免费丨 | 无码天堂亚洲国产AV| 免费久久精品国产片香蕉| 免费污视频在线观看| 亚洲中文无码卡通动漫野外| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲国产精品尤物yw在线| 免费观看无遮挡www的视频| 日本一区二区三区免费高清在线| 亚洲精品在线电影|