Ответ 1
Эта запись предлагает:
sed -n '52p' (file)
для печати 52-й строки файла.
Я ищу команду unix для получения одной строки, передавая номер строки большому файлу (около 5 миллионов записей). Например, чтобы получить 10-ю строку, я хочу сделать что-то вроде
command file-name 10
Есть ли такая команда? Мы можем сделать это, перейдя по каждой записи, но это займет много времени.
Эта запись предлагает:
sed -n '52p' (file)
для печати 52-й строки файла.
Вперед, Есть много способов сделать это и другие связанные вещи.
Если вы хотите напечатать несколько строк,
sed -n -e 'Np' -e 'Mp'
Где N и M - строки, которые будут напечатаны только. См. Этот 10 Удивительных примеров для просмотра огромных файлов журналов в Unix
Вы можете сделать что-то вроде:
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>
!
command | sed -n '10p'
или
sed -n '10p' file
вы можете использовать awk
awk 'NR==10{print;exit}' file
Положите выход после печати 10-й строки, чтобы awk не обработал файл с 5 миллионами записей.