Perl 在Unix中获取文件的特定行

Perl 在Unix中获取文件的特定行,perl,shell,unix,awk,sed,Perl,Shell,Unix,Awk,Sed,我想从一个文件中提取特定的行,比如第2行、第4行到第6行,并将它们重定向到命令行中的一个文件中,或者通过管道将其传输到另一个程序 哪种工具可以完成最快/最干净的sed、awk、perl、shell?使用awk及其参数NR。您可以编写条件表达式,例如: $ cat a aa bb cc dd ee $ awk 'NR==3' a #print line number 3 cc $ awk 'NR==3, NR==5' a #print from line number 3 up to number

我想从一个文件中提取特定的行,比如第2行、第4行到第6行,并将它们重定向到命令行中的一个文件中,或者通过管道将其传输到另一个程序

哪种工具可以完成最快/最干净的sed、awk、perl、shell?

使用awk及其参数NR。您可以编写条件表达式,例如:

$ cat a
aa
bb
cc
dd
ee
$ awk 'NR==3' a #print line number 3
cc
$ awk 'NR==3, NR==5' a #print from line number 3 up to number 5
cc
dd
ee
$ awk 'NR>2 && NR<7' a #print lines whose number is in the range (2,7)
cc
dd
ee
等等

就你而言

$ awk 'NR==2; NR>=4 && NR<=6' a #print line number 2 and from 4 to 6

Sed有一个很好的方法:

sed -ne '2p' -e '4,6p'
例如:

$ printf '%s\n' {1..100} | sed -ne '2p' -e '4,6p'
2
4
5
6
NR=3; cat test.txt | head -n $NR | tail -n -1
你可以用头和尾巴来做

例如:

$ printf '%s\n' {1..100} | sed -ne '2p' -e '4,6p'
2
4
5
6
NR=3; cat test.txt | head -n $NR | tail -n -1
从test.txt中提取第3行;及


提取第3行到第5行。

使用awk并保持其清晰和简单:

awk 'NR==2 || (NR>=4 && NR<=6)' file

为什么Perl是一个坏标签?我该如何改进这个问题?谢谢我有点震惊,这不是一个骗局——这本质上是一个经典问题。但我不认为这是一个坏问题。可能的重复不是完全重复,但是,因为这个问题问如何得到一行,然后,稍后,一个范围。现在我想,这个问题的措辞是购物,因为它意味着你已经知道哪些工具是可用的,只是想知道哪个是最好的。最好是简单地询问如何从文件中拾取任意行(单个行和范围),而不要假设任何关于工具链的内容。关于清洁和速度的部分应该不言而喻。
awk 'NR==2 || (NR>=4 && NR<=6)' file