Linux shell逐行读取文件的方法-比较
生活随笔
收集整理的這篇文章主要介紹了
Linux shell逐行读取文件的方法-比较
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2387.html
? 在linux中有很多方法逐行讀取一個文件的方法,其中最常用的就是下面的腳本里的方法,而且是效率最高,使用最多的方法。為了給大家一個直觀的感受,我們將通過生成一個大的文件的方式來檢驗各種方法的執行效率。
方法1:while循環中執行效率最高,最常用的方法。 ? function while_read_LINE_bottm(){ ?While read LINE ?do echo $LINE done?? < $FILENAME } ? ???????? 注釋:我習慣把這種方式叫做read釜底抽薪,因為這種方式在結束的時候需要執行文件,就好像是執行完的時候再把文件讀進去一樣。 ? 方法2 : 重定向法;管道法: cat $FILENAME | while read LINE ? Function While_read_LINE(){ ?cat $FILENAME | while read LINE ?do echo?$LINE done } ????????? 注釋:我只所有把這種方式叫做管道法,相比大家應該可以看出來了吧。當遇見管道的時候管道左邊的命令的輸出會作為管道右邊命令的輸入然后被輸入出來。 ? 方法3: 文件描述符法 ? Function while_read_line_fd(){ Exec 3<&0 Exec 0<$FILENAME While read LINE Do ?Echo $LINE ?Exec 0<&<3 } ? ???????? 注釋: 這種方法分2步驟,第一,通過將所有內容重定向到文件描述符3來關閉文件描述符0.為此我們用了語法Exec 3<&0?。第二部將輸入文件放送到文件描述符0,即標準輸入。 ?? 方法4?? ?for? 循環。 ? function ?for_in_file(){ For ?i ?in??`cat $FILENAME` do echo $i done } ?????????? 注釋:這種方式是通過for循環的方式來讀取文件的內容相比大家很熟悉了,這里不多說。 ? ? ???? 對各個方法進行測試,看那方法的執行效率最高。 ? ?????????? 首先我們用腳本(腳本見附件)生成一個70000行的文件,文件位置在/scripts/bigfile。然后通過下面的腳本來測試各個方法的執行效率,腳本很簡單,不再解釋。 ? #!/bin/bash FILENAME="$1" TIMEFILE="/tmp/loopfile.out" > $TIMEFILE SCRIPT=$(basename $0) ? function usage(){ echo -e "\nUSAGE: $SCRIPT file \n" ? exit 1 } ? function while_read_bottm(){ ? while read LINE do echo $LINE ? done?< $FILENAME ? } ? function while_read_line(){ ? cat $FILENAME | while read LINE do echo $LINE done ? } ? ?function while_read_line_fd(){ ? exec 3<&0 exec 0< $FILENAME while read LINE do ?echo $LINE done ?exec 0<&3 } ? function?for_in_file(){ for?i?in?? `cat $FILENAME` do echo $i done } ? if [ $# -lt 1 ] ; then usage fi ?echo?-e " \n starting file processing of each method\n" ?echo -e "method 1:" ?echo -e "function?while_read_bottm" ?time?while_read_bottm?>> $TIMEFILE ? echo -e "\n" ? echo -e "method 2:" echo -e?"function while_read_line " time?while_read_line >> $TIMEFILE ? echo -e "\n" echo -e "method 3:" echo "function?while_read_line_fd" time?while_read_line_fd >>$TIMEFILE ? echo -e "\n" echo -e "method 4:" echo -e "function?? for_in_file" time ??for_in_file >> $TIMEFILE ? ???? 執行腳本后: [root@localhost shell]# ./while?/scripts/bigfile 腳本輸出內容: method 1: function?while_read_bottm ? real??? 0m5.689s user??? 0m3.399s sys???? 0m1.588s ? ? method 2: function while_read_line ? real??? 0m11.612s user??? 0m4.031s sys???? 0m4.956s ? ? method 3: function?while_read_line_fd ? real??? 0m5.853s user??? 0m3.536s sys???? 0m1.469s ? ? method 4: function?? for_in_file ? real??? 0m5.153s user??? 0m3.335s sys???? 0m1.593s ? ? 下面我們對各個方法按照速度進行排序。 real??? 0m5.153s??? method 4 (for 循環法) real??? 0m5.689s??? method 1?? (while 釜底抽薪法) real??? 0m5.853s??? method 3??? (標識符法) real??? 0m11.612s?? method 2???? (管道法) ? ?由此可見在各個方法中,for語句效率最高,而在while循環中讀寫文件時, while read LINE do echo $LINE ? done?< $FILENAME方式執行效率最高。
總結
以上是生活随笔為你收集整理的Linux shell逐行读取文件的方法-比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌Gboard输入法新增“无痕模式”:
- 下一篇: C语言插入排序算法及代码