我正在寻找一个unix命令,通过将行号传递给大文件(大约500万条记录)来获取单行。例如,要获得第10行,我想要做类似unix命令通过传递行号从文件中读取行
command file-name 10
是否有任何此类命令可用?我们可以通过循环遍历每条记录来做到这一点,但这将是非常耗时的过程。
我正在寻找一个unix命令,通过将行号传递给大文件(大约500万条记录)来获取单行。例如,要获得第10行,我想要做类似unix命令通过传递行号从文件中读取行
command file-name 10
是否有任何此类命令可用?我们可以通过循环遍历每条记录来做到这一点,但这将是非常耗时的过程。
command | sed -n '10p'
或
sed -n '10p' file
你可以这样做:
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>
解决方案是最快的!
您可以使用AWK
awk 'NR==10{print;exit}' file
将退出打印10号线,这样awk将不会处理500万条记录进一步文件之后。
展望未来,有很多方法可以做到这一点,还有其他相关的东西。
如果要打印多行,
sed -n -e 'Np' -e 'Mp'
其中,N和M将只被打线。请参考这10 Awesome Examples for Viewing Huge Log Files in Unix
如果我想要1000行文件中的多条记录,该怎么办?我怎样才能在这个通讯中传递多个行? – Pooja25 2016-09-22 21:38:13
为什么()?这给了我的bash版本一个错误,但可能已在更高版本中得到纠正。 – Anders 2010-07-20 00:44:13
他的意思是让你替换(文件)文件 – Malfist 2010-07-20 01:00:35
我能够十(与文件100000行使用时)的因素由印刷后退出加快这:'sed的-n '52 {P; q}'' – Philipp 2010-07-20 08:25:32