2010-07-20 122 views
21

我正在寻找一个unix命令,通过将行号传递给大文件(大约500万条记录)来获取单行。例如,要获得第10行,我想要做类似unix命令通过传递行号从文件中读取行

command file-name 10 

是否有任何此类命令可用?我们可以通过循环遍历每条记录来做到这一点,但这将是非常耗时的过程。

回答

39

forum entry表明:

sed -n '52p' (file) 

用于打印文件的第52行。

+0

为什么()?这给了我的bash版本一个错误,但可能已在更高版本中得到纠正。 – Anders 2010-07-20 00:44:13

+1

他的意思是让你替换(文件)文件 – Malfist 2010-07-20 01:00:35

+3

我能够十(与文件100000行使用时)的因素由印刷后退出加快这:'sed的-n '52 {P; q}'' – Philipp 2010-07-20 08:25:32

2
command | sed -n '10p' 

sed -n '10p' file 
3

你可以这样做:

head -n<lineno> <file> | tail -n1 

这将使你的<lineno>线,然后只给输出(路线)的最后一行。

编辑:看来这里所有的解决方案都很慢。但是,根据定义,您必须遍历所有记录,因为操作系统无法解析面向行的文件,因为文件是面向字节的。 (从某种意义上说,所有这些方案都要做的是计算的\n\r字符数。)代替一个伟大的答案,我也会提出我的一些这些命令的系统上的计时!

[[email protected] ~]$ time sed -n '145430980p' br.txt 
0b10010011111111010001101111010111 

real 0m25.871s 
user 0m17.315s 
sys 0m2.360s 
[[email protected] ~]$ time head -n 145430980 br.txt | tail -n1 
0b10010011111111010001101111010111 

real 0m41.112s 
user 0m39.385s 
sys 0m4.291s 
[[email protected] ~]$ time awk 'NR==145430980{print;exit}' br.txt 
0b10010011111111010001101111010111 

real 2m8.835s 
user 1m38.076s 
sys 0m3.337s 

因此,在我的系统上,它看起来像sed -n '<lineno>p' <file>解决方案是最快的!

1

您可以使用AWK

awk 'NR==10{print;exit}' file 

将退出打印10号线,这样awk将不会处理500万条记录进一步文件之后。

5

展望未来,有很多方法可以做到这一点,还有其他相关的东西。

如果要打印多行,

sed -n -e 'Np' -e 'Mp' 

其中,N和M将只被打线。请参考这10 Awesome Examples for Viewing Huge Log Files in Unix

+1

如果我想要1000行文件中的多条记录,该怎么办?我怎样才能在这个通讯中传递多个行? – Pooja25 2016-09-22 21:38:13