我正在寻找一个unix命令,通过将行号传递给一个大文件(大约有500万条记录)来获取单行。例如,要获得第10行,我想做类似
的事情command file-name 10
有没有这样的命令?我们可以通过循环遍历每条记录来完成此操作,但这将是一个耗时的过程。
答案 0 :(得分:43)
答案 1 :(得分:6)
展望未来,有很多方法可以做到,以及其他相关的东西。
如果您想要打印多行,
sed -n -e 'Np' -e 'Mp'
其中N和M是仅打印的行。请参阅此10 Awesome Examples for Viewing Huge Log Files in Unix
答案 2 :(得分:2)
command | sed -n '10p'
或
sed -n '10p' file
答案 3 :(得分:2)
您可以执行以下操作:
head -n<lineno> <file> | tail -n1
这会给你<lineno>
行,然后只给出最后一行输出(你的行)。
编辑:看来这里的所有解决方案都很慢。但是,根据定义,您将不得不遍历所有记录,因为操作系统无法解析面向行的文件,因为文件是面向字节的。 (在某种意义上,所有这些程序要做的就是计算\n
或\r
个字符的数量。)为了代替一个好的答案,我还会在我的几个系统上显示时间这些命令!
[mjschultz@mawdryn ~]$ time sed -n '145430980p' br.txt
0b10010011111111010001101111010111
real 0m25.871s
user 0m17.315s
sys 0m2.360s
[mjschultz@mawdryn ~]$ time head -n 145430980 br.txt | tail -n1
0b10010011111111010001101111010111
real 0m41.112s
user 0m39.385s
sys 0m4.291s
[mjschultz@mawdryn ~]$ time awk 'NR==145430980{print;exit}' br.txt
0b10010011111111010001101111010111
real 2m8.835s
user 1m38.076s
sys 0m3.337s
因此,在我的系统上,sed -n '<lineno>p' <file>
解决方案看起来最快!
答案 4 :(得分:1)
你可以使用awk
awk 'NR==10{print;exit}' file
打印第10行后放置一个出口,这样awk就不会进一步处理500万条记录文件。