Как извлечь строки из файла, используя их номер строки в unix?

Используя sed или подобное, как бы вы извлекали строки из файла? Если бы мне нужны строки 1, 5, 1010, 20503 из файла, как бы я получил эти 4 строки?

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

Ответ 1

Что-то вроде "sed -n '1p; 5p; 1010p; 20503p". Выполните команду "man sed" для деталей.

Для вашего второго вопроса я преобразовал входной файл в группу команд sed (1), чтобы напечатать нужные строки.

Ответ 2

с awk это просто:

awk 'NR==1 || NR==5 || NR==1010' "file"

Ответ 3

@OP, вы можете сделать это проще и эффективнее с awk. поэтому для вашего первого вопроса

awk 'NR~/^(1|2|5|1010)$/{print}' file

для второго вопроса

awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file

Ответ 4

Я бы изучил Perl, поскольку у него есть средства регулярного выражения sed плюс модель программирования, окружающая его, чтобы вы могли читать файл за строкой, подсчитывать строки и извлекать в соответствии с тем, что вы хотите (в том числе от файл номеров строк).

my $row = 1
while (<STDIN>) {
   # capture the line in $_ and check $row against a suitable list.
   $row++;
}

Ответ 5

Это не так, и при некоторых обстоятельствах он может превышать пределы длины команды *:

sed -n "$(while read a; do echo "${a}p;"; done < line_num_file)" data_file

Или его гораздо более медленный, но более привлекательный и, возможно, более здоровый, брат:

while read a; do echo "${a}p;"; done < line_num_file | xargs -I{} sed -n \{\} data_file

Вариант:

xargs -a line_num_file -I{} sed -n \{\}p\; data_file

Вы можете немного ускорить версии xarg, добавив опцию -P с некоторым большим аргументом, например, 83 или, возможно, 419 или даже 1177, но 10 кажется таким же хорошим, как и любой.

* xargs --show-limits </dev/null может быть поучительным

Ответ 6

В Perl:

perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file