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