unix命令通过传递行号从文件中读取行

时间:2010-07-20 00:17:17

标签: unix

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

的事情
command file-name 10

有没有这样的命令?我们可以通过循环遍历每条记录来完成此操作,但这将是一个耗时的过程。

5 个答案:

答案 0 :(得分:43)

forum entry表明:

sed -n '52p' (file)

用于打印文件的第52行。

答案 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万条记录文件。