Method 1: PIPED while-read loop
#!/bin/bash FILENAME=$1 count=0 cat $FILENAME | while read LINE do let count++ echo "$count $LINE" done echo -e "\nTotal $count Lines read"
Method 2: Redirected “while-read” loop
#!/bin/bash FILENAME=$1 count=0 while read LINE do let count++ echo "$count $LINE" done < $FILENAME echo -e "\nTotal $count Lines read"
Method 3:while read LINE Using File Descriptors
#!/bin/bash FILENAME=$1 count0= exec 3<&0 exec 0< $FILENAME while read LINE do let count++ echo "$count $LINE" done exec 0<&3 echo -e "\nTotal $count Lines read"
Method 4: Process file line by line using awk
#!/bin/bash FILENAME=$1 awk '{kount++;print kount, $0} END{print "\nTotal " kount " lines read"}' $FILENAME
Time Comparison
# du -h bigfile.txt 70M bigfile.txt # wc -l bigfile.txt 900000 bigfile.txt
# time ./method1.sh bigfile.txt >/dev/null real 6m2.911s user 2m58.207s sys 2m58.811s # time ./method2.sh bigfile.txt > /dev/null real 2m48.394s user 2m39.714s sys 0m8.089s # time ./method3.sh bigfile.txt > /dev/null real 2m48.218s user 2m39.322s sys 0m8.161s # time ./method4.sh bigfile.txt > /dev/null real 0m2.054s user 0m1.924s sys 0m0.120s
Source de cet article : http://www.bashguru.com/2010/05/how-to-read-file-line-by-line-in-shell.html
(Article complet avec explications, mais aussi plein de pubs^^)