Answers:
您可以尝试:
cat textfile | head -n 45 | tail -n 26
要么
cat textfile | awk "20 <= NR && NR <= 45"
更新:
正如Mahomedalid所指出的那样,cat
这不是必需的,而且有点多余,但这确实使命令清晰易读。
如果cat
打扰您,那么更好的解决办法是:
<textfile awk "20 <= NR && NR <= 45"
,
范围运算符。
更简单:
sed -n '20,45p;45q' < textfile
-n标志禁用默认输出。“ 20,45”寻址第20至45行(含)。“ p”命令显示当前行。打印行后,q退出。
q
命令(所有从开头的命令;
)对我来说都提高了性能。
这不是答案,但不能将其发布为评论。
mikeserv 在这里建议了另一种(非常快速的)方法:
{ head -n 19 >/dev/null; head -n 26; } <infile
使用与此处相同的测试文件和相同的步骤,这里有一些基准测试(提取行1000020-1000045):
mikeserv:
{ head -n 1000019 >/dev/null; head -n 26; } <iplist
real 0m0.059s
斯蒂芬:
head iplist -n 1000045 | tail -n 26
real 0m0.054s
这些是迄今为止最快的解决方案,并且差异可以忽略不计(单遍)(我尝试了不同的范围:几行,几百万行等)。
但是,对于需要以类似方式查找多个范围的线的应用程序来说,不用管道就可以提供很大的优势,例如:
for pass in 0 1 2 3 4 5 6 7 8 9
do printf "pass#$pass:\t"
head -n99 >&3; head -n1
done <<1000LINES 3>/dev/null
$(seq 1000)
1000LINES
...打印...
pass#0: 100
pass#1: 200
pass#2: 300
pass#3: 400
pass#4: 500
pass#5: 600
pass#6: 700
pass#7: 800
pass#8: 900
pass#9: 1000
...并且只读取一次文件。
其他sed
/ awk
/ perl
解决方案读取整个文件,因为这是对大型文件,他们不是非常有效。我在指定范围的最后一行之后添加了一些替代方法exit
或q
uit:
斯蒂芬:
awk "1000020 <= NR && NR <= 1000045" iplist
real 0m2.448s
与
awk "NR >= 1000020;NR==1000045{exit}" iplist
real 0m0.243s
dkagedal(sed
):
sed -n 1000020,1000045p iplist
real 0m0.947s
与
sed '1,1000019d;1000045q' iplist
real 0m0.143s
史蒂文·D:
perl -ne 'print if 1000020..1000045' iplist
real 0m2.041s
与
perl -ne 'print if $. >= 1000020; exit if $. >= 1000045;' iplist
real 0m0.369s
awk NR==1000020,NR==1000045 textfile
在您的系统中会很高兴。
awk NR==20,NR==45 textfile
也可以使用,并且易于阅读。