Команда unix для чтения строки из файла путем передачи номера строки - PullRequest
21 голосов
/ 20 июля 2010

Я ищу команду unix для получения одной строки путем передачи номера строки в большой файл (с около 5 миллионами записей). Например, чтобы получить 10-ю строку, я хочу сделать что-то вроде

command file-name 10

Есть ли такая команда в наличии? Мы можем сделать это, просматривая каждую запись, но это займет много времени.

Ответы [ 5 ]

44 голосов
/ 20 июля 2010

Эта запись на форуме предлагает:

sed -n '52p' (file)

для печати 52-й строки файла.

6 голосов
/ 20 июля 2010

В дальнейшем, есть много способов сделать это и другие связанные вещи.

Если вы хотите напечатать несколько строк,

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

Где N и Mстроки, которые будут только напечатаны.См. Это 10 Потрясающих примеров для просмотра огромных файлов журнала в Unix

2 голосов
/ 20 июля 2010

Вы можете сделать что-то вроде:

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> самое быстрое!

2 голосов
/ 20 июля 2010
command | sed -n '10p'

или

sed -n '10p' file
1 голос
/ 20 июля 2010

вы можете использовать awk

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

Поставьте выход после печати 10-й строки, чтобы awk больше не обрабатывал файл 5 миллионов записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...