Подтвердить что ты не робот

Unix для чтения строки из файла путем передачи номера строки

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

command file-name 10

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

4b9b3361

Ответ 1

Эта запись предлагает:

sed -n '52p' (file)

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

Ответ 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>!

Ответ 4

command | sed -n '10p'

или

sed -n '10p' file

Ответ 5

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

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

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