当前位置:  开发笔记 > 编程语言 > 正文

如何从Unix上的文本文件中提取预定范围的行?

如何解决《如何从Unix上的文本文件中提取预定范围的行?》经验,为你挑选了10个好方法。

我有一个~23000行的SQL转储包含几个数据库的数据.我需要提取此文件的某个部分(即单个数据库的数据)并将其放在一个新文件中.我知道我想要的数据的起始行和结束行号.

有没有人知道一个Unix命令(或一系列命令)从第16224和16482行之间的文件中提取所有行,然后将它们重定向到一个新文件?



1> 小智..:
sed -n '16224,16482p;16483q' filename > newfile

从sed手册:

p - 打印出图案空间(到标准输出).此命令通常仅与-n命令行选项一起使用.

n - 如果未禁用自动打印,则打印图案空间,然后,无论如何,将图案空间替换为下一行输入.如果没有更多输入,那么sed退出而不再处理任何命令.

q - 退出sed而不处理更多命令或输入.请注意,如果未使用-n选项禁用自动打印,则会打印当前模式空间.

sed脚本中的地址可以采用以下任何一种形式:

number 指定行号仅匹配输入中的该行.

可以通过指定用逗号(,)分隔的两个地址来指定地址范围.地址范围匹配从第一个地址匹配的行开始,并继续直到第二个地址匹配(包含).


如果像我一样,你需要在一个非常大的文件上执行此操作,如果你在下一行添加一个quit命令会有所帮助.然后是'sed -n'16224,16482p; 16483q'filename`.否则sed将继续扫描直到结束(或至少我的版本).
@MilesRout的人似乎在问"为什么要进行downvote?" 很多时候,也许你的意思是"我不在乎"而不是"无人问津"

2> JXG..:
sed -n '16224,16482 p' orig-data-file > new-file

16224,16482是起始行号和结束行号,包括在内.这是1索引的. -n抑制将输入作为输出回显,这显然是你不想要的; 数字表示使以下命令操作的行数范围; 该命令p打印出相关的行.


好吧,从这里的答案(http://stackoverflow.com/a/2237656/1054260)来看,似乎可以通过以下方式停止在范围的末尾:`sed -n'16224,16482p; 16482q' orig-data-file> new-file`.
我喜欢空白; 它保持可读性.
在大文件上,上述命令将在找到所需范围后继续遍历整个文件.有没有办法让sed在输出范围后停止处理文件?
你为什么要放入一个不必要的空间,然后引用?(当然,制造不必要的问题并解决它们是半数计算机科学的本质,但我的意思是除了那个原因......)

3> manveru..:

使用头/尾非常简单:

head -16482 in.sql | tail -258 > out.sql

使用sed:

sed -n '16482,16482p' in.sql > out.sql

使用awk:

awk 'NR>=10&&NR<=20' in.sql > out.sql


值得注意的是,为了保持与问题相同的行号,sed命令应该是`sed -n 16224,16482p'in.sql> out.sql`并且awk命令应该是'awk'NR> = 16224 && NR <= 16482 'in.sql> out.sql`
另外值得一提的是,在第一个例子`head -16482 in.sql |的情况下 tail - $((16482-16224))> out.sql`将计算结果保留为bash
也可以使用“ tail -n +16224”来减少计算

4> 小智..:

您可以使用'vi'然后使用以下命令:

:16224,16482w!/tmp/some-file

或者:

cat file | head -n 16482 | tail -n 258

编辑: - 只是添加说明,你使用head -n 16482显示第一个16482行然后使用tail -n 258来获得第一个输出中的最后258行.


head -n 16482 file | tail -n 258应该更好用
而不是vi你可以使用ex,即vi减去交互式控制台的东西.

5> fedorqui..:

还有另一种方法awk:

awk 'NR==16224, NR==16482' file

如果文件很大,那么exit在读完最后一行后可能会很好.这样它就不会不必要地读取文件直到最后:

awk 'NR==16224, NR==16482-1; NR==16482 {print; exit}' file



6> 小智..:
perl -ne 'print if 16224..16482' file.txt > new_file.txt



7> Cetra..:
 # print section of file based on line numbers
 sed -n '16224 ,16482p'               # method 1
 sed '16224,16482!d'                 # method 2



8> JP Lodine..:
cat dump.txt | head -16224 | tail -258

应该做的伎俩.这种方法的缺点是你需要做算术来确定尾部的参数,并考虑你是否希望'between'包括结束行.


你不需要`cat`命令; `head`可以直接读取文件.这比许多替代方案慢,因为它使用2(如图所示3)命令,其中1就足够了.

9> cubex..:

sed -n '16224,16482p' < dump.sql



10> Tilman Vogel..:

我站在Boxxar的肩膀上,像这样:

sed -n ',$p;q' input

例如

sed -n '16224,$p;16482q' input

$意思是“最后行”,所以第一个命令使sed打印开始的行中的所有行16224和所述第二命令使sed退出打印线16428。(添加1q在boxxar的解决方案-范围似乎没有必要。)

我喜欢这种变体,因为我不需要两次指定结束行号。而且我测量到使用$不会对性能产生不利影响。

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有