Как печатать n-ésima линию файла?

Давайте предполагать, что у меня есть файл archivo со многими линиями, но только я хочу напечатать одну в частности, давайте говорить число n.

Как я могу получать это используя программные средства, которые были бы в стандартной системе Linux? Выбор head XX archivo | tail -N она мне кажется мало практической.

18
задан 01.12.2015, 12:22
4 ответа

Легкий для того, чтобы быть написанным:

sed -n 123456p

Быстрее, особенно, если линия не около конца:

sed '123456q; d'

Немного быстрее, по крайней мере, если файл - большой (benchmarks):

tail -n +123457 | head -n 1

head … | tail … он гораздо более медленный, потому что первые 123465 линий проходят по трубе.

21
ответ дан 08.11.2019, 21:06

Ты можешь делать это используя команду sed (Стреам Эдитор):

sed 'LINEAq;d' file

Пример:

$ cat hello.go
package main

import (
    "fmt"
)

func main() {
    fmt.Printf("hello, world\n")
}

Печатать первую lГ-nea:

$ sed '1q;d' hello.go
package main}

Печатать ее sГ©ptima lГ-nea:

$ sed '7q;d' hello.go
func main() {

Для большего informaciГіn на sed, ты можешь посещать documentaciГіn чиновник из GNU.

18
ответ дан 08.11.2019, 21:06

Мне приходят в голову несколько выборов.

С awk мы можем говорить:

awk 'NR==n' archivo

и если число содержалось в переменной $numero, мы можем говорить:

awk -v linea="$numero" 'NR==linea' archivo

Как NR он относится к линии, которая читается в данном моменте, только мы должны сравнивать Вашу стоимость со стоимостью переменной, которую мы распределяем ему через -v linea="n". Например, -v linea=5.

Если оказывается, что файл очень, очень большой, всегда мы можем выходить однажды былась imprimido линия это, чтобы не продолжать читать без необходимости:

awk 'NR==linea {print; exit}' archivo

Если мы предпочитаем использовать sed, мы можем говорить:

sed -n 'Np' archivo

И для больших файлов:

sed -n 'N{p;q;}' archivo

Это напечатает линию я нумерую N и далее он остановит выполнение.

Если стоимость находится в переменной, мы должны использовать двойные кавычки для того, чтобы стоимость расширилась и ${n} для того, чтобы было понятно, что имя переменной $n и нет $np:

sed -n "${n}p" archivo
6
ответ дан 08.11.2019, 21:06
  • 1
    :-D Я Верю в то, что opció n má s rá pid он: awk ' NR == линия { print; exit } ' архив – luisgulo 22.11.2017, 01:32
  • 2
    @luisgulo у тебя есть вся razó n, так как он прекращает обрабатывать файл, найдя lí nea, что важно. Для огромных файлов он значимый этот exit, для тех tamañ или normalito я не думаю, что это различие слишком воспринимаемого времени. – fedorqui 24.11.2017, 14:05

head и pipe с tail serГ-an медленные для очень большого файла. Я recomendarГ, - чтобы использовать sed asГ-:

sed 'NUMq;d' archivo

, Где NUM состоит nГєmero lГ-nea в том, что ты хочешь напечатать.

Шрифт

4
ответ дан 08.11.2019, 21:06