<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測試了一下,效率是相當?shù)牡停?br /> real    2m51.099s
    user    2m1.268s
    sys    0m4.260s
    2.用head解決,此法比sed有一個質(zhì)的的提升,提升來自增大了緩存,不過依然沒有抓住問題的本質(zhì),還是做了不少無用功!解決方法來時cu上的熱心網(wǎng)友。
    head -n-1 input.file > output.file
    real    0m23.687s
    user    0m0.212s
    sys    0m4.668s
    3.用vim解決,此法很別處心裁,這應(yīng)該是遇到這個問題的最先想到的一種。解決方法來自我加的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寫效率最高,但顯然,代碼也是最長的,我實現(xiàn)了代碼,
    測試了一下,
    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相似。  回復(fù)  更多評論
      
    # re: 高效率刪除文本文件的最后一行 2010-04-22 11:02 | xzc
    文件行數(shù)
    cat DAPMmxdata004.20100421.201003.0001.771|wc -l  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲第一街区偷拍街拍| 亚洲av无码专区在线电影| av片在线观看永久免费| 免费人成视网站在线观看不卡| 亚洲色欲色欲www在线播放| 女人毛片a级大学毛片免费| 亚洲国产AV一区二区三区四区 | 精品亚洲456在线播放| 国产精品69白浆在线观看免费| 久久亚洲最大成人网4438| 成人网站免费观看| 美女免费视频一区二区| 亚洲国产精品一区二区第一页免 | 国产男女猛烈无遮挡免费视频| 亚洲va中文字幕| 亚洲人成人网站在线观看| 91视频精品全国免费观看| 亚洲日本va中文字幕久久| 99久久久国产精品免费牛牛四川| 亚洲最新在线视频| 男女啪啪永久免费观看网站| 粉色视频在线观看www免费| 亚洲精品无码专区在线在线播放 | 99国产精品永久免费视频 | 亚洲色婷婷综合开心网| 国产免费一区二区三区在线观看| 亚洲精品电影在线| 暖暖免费高清日本中文| xxxxxx日本处大片免费看 | 日本亚洲欧洲免费天堂午夜看片女人员 | 久久久久亚洲AV成人网人人网站 | www国产亚洲精品久久久| 日本道免费精品一区二区| 亚洲一区二区在线视频| 女人张腿给男人桶视频免费版 | 一级毛片正片免费视频手机看| 国产亚洲精品a在线观看app | 成人亚洲网站www在线观看| 久久国产精品萌白酱免费| 亚洲国产精品无码久久98| 久久久久久久尹人综合网亚洲|