Ответ 1
Что-то вроде "sed -n '1p; 5p; 1010p; 20503p". Выполните команду "man sed" для деталей.
Для вашего второго вопроса я преобразовал входной файл в группу команд sed (1), чтобы напечатать нужные строки.
Используя sed или подобное, как бы вы извлекали строки из файла? Если бы мне нужны строки 1, 5, 1010, 20503 из файла, как бы я получил эти 4 строки?
Что делать, если у меня есть достаточно большое количество строк, которые мне нужно извлечь? Если бы у меня был файл со 100 строками, каждый из которых представлял номер строки, который я хотел извлечь из другого файла, как бы я это сделал?
Что-то вроде "sed -n '1p; 5p; 1010p; 20503p". Выполните команду "man sed" для деталей.
Для вашего второго вопроса я преобразовал входной файл в группу команд sed (1), чтобы напечатать нужные строки.
с awk это просто:
awk 'NR==1 || NR==5 || NR==1010' "file"
@OP, вы можете сделать это проще и эффективнее с awk. поэтому для вашего первого вопроса
awk 'NR~/^(1|2|5|1010)$/{print}' file
для второго вопроса
awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file
Я бы изучил Perl, поскольку у него есть средства регулярного выражения sed
плюс модель программирования, окружающая его, чтобы вы могли читать файл за строкой, подсчитывать строки и извлекать в соответствии с тем, что вы хотите (в том числе от файл номеров строк).
my $row = 1
while (<STDIN>) {
# capture the line in $_ and check $row against a suitable list.
$row++;
}
Это не так, и при некоторых обстоятельствах он может превышать пределы длины команды *:
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
может быть поучительным
В Perl:
perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file