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^^)