【发布时间】:2015-04-19 16:57:38
【问题描述】:
如何读取两个特定行之间的所有行?
假设第 23 行是我要开始的地方,第 56 行是要读取的最后一行,但它不是文件的结尾。
我将如何阅读第 23 到 56 行?我会将它们输出到另一个文件。
【问题讨论】:
如何读取两个特定行之间的所有行?
假设第 23 行是我要开始的地方,第 56 行是要读取的最后一行,但它不是文件的结尾。
我将如何阅读第 23 到 56 行?我会将它们输出到另一个文件。
【问题讨论】:
使用awk 可以很容易地按行号:
awk 'NR >= 23 && NR <= 56'
无论哪种方式,sed 都很有趣。
sed '23,56!d'
或者对于一个模式,
sed '/start/,/end/!d'
【讨论】:
awk 'NR >= 23 && NR <= 56' file 不这样做,请您提供完整的命令
awk 没有执行默认操作。试试awk 'NR >= 23 && NR <= 56 { print $0 }' file
time awk 'NR >= 50000 && NR <= 60000' qwe > /dev/null = 0m0.069s
我会选择 sed,但也可以使用头/尾组合: 罢工>
head -n 56 file | tail -n $((56-23))
嗯 - 我很确定里面有一个错误。我要找到它。 :)
哈哈 - 知道你的错误,我找到了:
head -n 56 file | tail -n $((56-23+1))
【讨论】:
time sed -n 50000,60000p qwe > /dev/null = 0m0.015s 和 time (head -n 60000 qwe | tail -n 10000 > /dev/null) = 0m0.003s -- 保持简单
Sed 可以做到这一点:
$ sed -n 23,56p yourfile
编辑:正如评论者指出的那样,在间隔的最后一行之后停止处理 sed 将使 sed 的执行速度与头尾组合一样快。所以获得线条的最佳方式是
$ sed -n '23,56p;57q' yourfile
但性能在很大程度上取决于您正在处理的文件、时间间隔和许多其他因素。因此,如果您正在开发一些脚本以在已知数据上频繁运行,测试答案中提到的所有三种方法(sed、awk、head-tail)将是一个好主意。
【讨论】:
head-tail 组合(单个进程)具有更好的性能,特别是如果您正在这样做:sed -n '23,56p;57q' FILE。
使用 sed。这应该这样做。
sed -n '23,56p' > out.txt
【讨论】:
这可能对你有用:
sed '1,22d;56q' file
或者这个:
sed '23,56!d;56q' file
或者这个:
awk 'NR>56{exit};NR==23,NR==56' file
【讨论】: