<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ù)  更多評論
      
    主站蜘蛛池模板: 亚洲日韩国产二区无码| 亚洲中文字幕无码中文字在线 | 无码精品人妻一区二区三区免费| 久久久久久久91精品免费观看| 亚洲天堂一区二区| 日韩免费无码视频一区二区三区 | 亚洲AV无码国产一区二区三区| 成人免费视频小说| 婷婷国产偷v国产偷v亚洲| 国产jizzjizz免费看jizz| 无忧传媒视频免费观看入口| 亚洲精品国产精品国自产观看| 国产在线观看免费av站| 久久精品亚洲中文字幕无码网站| 99免费观看视频| 亚洲日本中文字幕天天更新| mm1313亚洲国产精品美女| 爽爽爽爽爽爽爽成人免费观看| 久久精品国产亚洲AV电影| 97无码免费人妻超级碰碰夜夜| 无码一区二区三区亚洲人妻| 亚洲宅男天堂在线观看无病毒| 三年片在线观看免费大全电影 | 无码亚洲成a人在线观看| 亚洲成A人片77777国产| 久久国产免费观看精品| 亚洲区视频在线观看| 四虎影视永久免费观看| 免费观看一区二区三区| 四虎亚洲精品高清在线观看| 亚洲av无码天堂一区二区三区| 久久久久久国产精品免费免费男同 | 最近免费mv在线电影| 亚洲色偷偷色噜噜狠狠99网| 亚洲国产成人久久综合区| 日韩视频免费在线观看| 亚洲日韩AV一区二区三区中文 | 在线观看永久免费| 午夜亚洲乱码伦小说区69堂| 亚洲av日韩av无码| 巨胸喷奶水视频www网免费|