หากเรารู้ช่วงที่จะเลือกจากบรรทัดแรก: lStart
ถึงบรรทัดสุดท้าย: lEnd
เราสามารถคำนวณ:
lCount="$((lEnd-lStart+1))"
หากเราทราบจำนวนบรรทัดทั้งหมด: lAll
เราสามารถคำนวณระยะทางจนถึงจุดสิ้นสุดของไฟล์:
toEnd="$((lAll-lStart+1))"
จากนั้นเราจะได้รู้ว่า:
"how far from the start" ($lStart) and
"how far from the end of the file" ($toEnd).
เลือกขนาดที่เล็กที่สุดของสิ่งเหล่าtailnumber
นี้:
tailnumber="$toEnd"; (( toEnd > lStart )) && tailnumber="+$linestart"
ช่วยให้เราใช้คำสั่งการดำเนินการที่เร็วที่สุดอย่างต่อเนื่อง:
tail -n"${tailnumber}" ${thefile} | head -n${lCount}
โปรดสังเกตเครื่องหมายบวก ("+") เพิ่มเติมเมื่อ$linestart
เลือก
ข้อแม้เดียวคือเราต้องนับจำนวนบรรทัดทั้งหมดและอาจต้องใช้เวลาเพิ่มเติมในการค้นหา
ตามปกติด้วย:
linesall="$(wc -l < "$thefile" )"
บางครั้งการวัดคือ:
lStart |500| lEnd |500| lCount |11|
real user sys frac
0.002 0.000 0.000 0.00 | command == tail -n"+500" test.in | head -n1
0.002 0.000 0.000 0.00 | command == tail -n+500 test.in | head -n1
3.230 2.520 0.700 99.68 | command == tail -n99999501 test.in | head -n1
0.001 0.000 0.000 0.00 | command == head -n500 test.in | tail -n1
0.001 0.000 0.000 0.00 | command == sed -n -e "500,500p;500q" test.in
0.002 0.000 0.000 0.00 | command == awk 'NR<'500'{next}1;NR=='500'{exit}' test.in
lStart |50000000| lEnd |50000010| lCount |11|
real user sys frac
0.977 0.644 0.328 99.50 | command == tail -n"+50000000" test.in | head -n11
1.069 0.756 0.308 99.58 | command == tail -n+50000000 test.in | head -n11
1.823 1.512 0.308 99.85 | command == tail -n50000001 test.in | head -n11
1.950 2.396 1.284 188.77| command == head -n50000010 test.in | tail -n11
5.477 5.116 0.348 99.76 | command == sed -n -e "50000000,50000010p;50000010q" test.in
10.124 9.669 0.448 99.92| command == awk 'NR<'50000000'{next}1;NR=='50000010'{exit}' test.in
lStart |99999000| lEnd |99999010| lCount |11|
real user sys frac
0.001 0.000 0.000 0.00 | command == tail -n"1001" test.in | head -n11
1.960 1.292 0.660 99.61 | command == tail -n+99999000 test.in | head -n11
0.001 0.000 0.000 0.00 | command == tail -n1001 test.in | head -n11
4.043 4.704 2.704 183.25| command == head -n99999010 test.in | tail -n11
10.346 9.641 0.692 99.88| command == sed -n -e "99999000,99999010p;99999010q" test.in
21.653 20.873 0.744 99.83 | command == awk 'NR<'99999000'{next}1;NR=='99999010'{exit}' test.in
โปรดทราบว่าเวลาเปลี่ยนไปอย่างมากหากบรรทัดที่เลือกอยู่ใกล้กับจุดเริ่มต้นหรือใกล้ถึงจุดสิ้นสุด คำสั่งที่ดูเหมือนว่าจะทำงานได้ดีที่ด้านหนึ่งของไฟล์อาจช้ามากที่ด้านอื่น ๆ ของไฟล์