2010-01-06 8 views
12

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

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

ответ

15

Что-то вроде «СЭД -n '1р, 5p, 1010p; 20503p. Выполните команду„ человек СЭД“Подробности

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

+1

+1, то, что нужно найти во второй части ответа, является 'sed -f' –

+0

'sed -n '1p; 5p; 1010p; 20503p inputFile.txt> outputFile.txt' – javaPlease42

0

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

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

и вы можете использовать Perl -e 'perlcode здесь' из командной строки. Perl также имеет оператор диапазона .. как в 3..12, который позволит вам создать список чисел, где это необходимо. –

+0

Вы должны использовать '$ .', который автоматически содержит текущий номер строки – Hasturkun

+0

@Hasturkun - не знал этого! Благодарю. –

4

с AWK это так просто, как:..

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

+1 для использования awk. – slebetman

+0

Я обожаю awk, но это, безусловно, касается sed. –

+0

@ Майкл согласился, что я просто показывал другой путь – ennuikiller

2

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

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

для 2-й вопрос

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

мои чувства точно. –

+0

Второй ответ немного запутан. Объяснение: 'FNR == NR' будет происходить только при чтении' file_with_linenr', а не 'file'. В этом случае текст строки добавляется к набору 'a', и выполнение переходит к следующей строке ввода. Таким образом, при чтении из 'файла' применяется только случай' (FNR in a) 'и печатает текст соответствующей строки, если его номер был помещен в' a' при разборе 'file_with_linenr'. – joeln

0

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

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 может быть поучительным

0

В Perl:

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

 Смежные вопросы

  • Нет связанных вопросов^_^