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

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

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

    隨筆-314  評(píng)論-209  文章-0  trackbacks-0

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

    測(cè)試用的文本文件800M
    1.用sed解決,此法最易想,但也是最笨的一個(gè),
    解決方法來(lái)自問(wèn)題的提出者:
    sed -e '$d' input.file > output.file
    用time測(cè)試了一下,效率是相當(dāng)?shù)牡停?br /> real    2m51.099s
    user    2m1.268s
    sys    0m4.260s
    2.用head解決,此法比sed有一個(gè)質(zhì)的的提升,提升來(lái)自增大了緩存,不過(guò)依然沒(méi)有抓住問(wèn)題的本質(zhì),還是做了不少無(wú)用功!解決方法來(lái)時(shí)cu上的熱心網(wǎng)友。
    head -n-1 input.file > output.file
    real    0m23.687s
    user    0m0.212s
    sys    0m4.668s
    3.用vim解決,此法很別處心裁,這應(yīng)該是遇到這個(gè)問(wèn)題的最先想到的一種。解決方法來(lái)自我加的unix like群里的一個(gè)叫石仔的管理員!
    vim + result
    dd
    這個(gè)沒(méi)測(cè)試,感覺(jué)效率和head法差不多,加載太慢!
    4.重量級(jí)要到場(chǎng)了,感謝cu版主的這個(gè)腳本,只能用四個(gè)字形容!五體投地!
    :|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)))
    測(cè)試了一下!
    real    0m0.123s
    user    0m0.004s
    sys    0m0.012s
    5.感覺(jué)這個(gè)用c寫(xiě)效率最高,但顯然,代碼也是最長(zhǎng)的,我實(shí)現(xiàn)了代碼,
    測(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中的最后一個(gè)字符為'\n'*/
       
        while (*(ptr + i) != '\n') {
            //printf("%c", *(ptr + i));

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

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

    評(píng)論:
    # 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)))
    也就是說(shuō):|的輸出是空字符串,而其作用正好與/dev/null相似。  回復(fù)  更多評(píng)論
      
    # re: 高效率刪除文本文件的最后一行 2010-04-22 11:02 | xzc
    文件行數(shù)
    cat DAPMmxdata004.20100421.201003.0001.771|wc -l  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲精品成人久久| 亚洲w码欧洲s码免费| 亚洲美国产亚洲AV| 亚洲黄网站wwwwww| 亚洲精品无码国产| 免费很黄很色裸乳在线观看| 动漫黄网站免费永久在线观看 | 久久久www成人免费毛片| 免费高清国产视频| 成在线人免费无码高潮喷水| 亚洲AV无码一区二区一二区| 亚洲an日韩专区在线| 亚洲精品国产福利在线观看| 亚洲成A∨人片在线观看不卡| 亚洲色偷偷狠狠综合网| 国产成人精品免费直播| 免费看片A级毛片免费看| 日本亚洲免费无线码| 精品女同一区二区三区免费站| 84pao强力永久免费高清| 免费国产叼嘿视频大全网站| A级毛片高清免费视频在线播放| 亚洲国产免费综合| 中国国产高清免费av片| 国产精品成人免费观看| 中国一级特黄的片子免费| fc2成年免费共享视频18| 男女交性无遮挡免费视频| 免费精品久久久久久中文字幕| 婷婷亚洲综合五月天小说在线| 亚洲精品动漫免费二区| 337p日本欧洲亚洲大胆人人| 亚洲av无码专区亚洲av不卡| 亚洲第一综合天堂另类专| 亚洲日韩在线中文字幕综合| 美女被免费视频网站| 高清免费久久午夜精品| 国产免费A∨在线播放| 最近中文字幕大全免费版在线| 久久免费精彩视频| 亚洲一区免费在线观看|