2008-10-13 2 views
9

Я могу написать тривиальный скрипт, чтобы сделать это, но в моем постоянном стремлении получить больше familiar с помощью unix. Я бы хотел изучить эффективные методы, используя встроенные команды.Пропустить строки файла до тех пор, пока совпадение не будет найдено, а затем вывести остальные

Мне нужно иметь дело с очень большими файлами с переменным количеством строк заголовка. последняя строка заголовка состоит из текста «LastHeaderLine». Я хочу вывести все после этой строки. (Я не беспокоюсь о ложноположительных спичек.)

ответ

6

Использование СЭД:

sed -ne '/LastHeaderLine/,$p' <inputfile 

будет соответствовать все, от матча регулярного выражения до конца файла. 'p' печатает строки, которые соответствуют.

Edit:

На второй мысли, вы не хотите, чтобы напечатать строку, соответствующую LastHeaderLine. Это сложно сделать с sed. В perl вы можете сделать следующее:

perl -ne 'if ($flag) {print;} if (/LastHeaderFile/) {$flag=1;}' <inputfile 

Это будет печатать только строки строго после соответствия регулярному выражению.

9

Почему бы не попробовать awk для этого? Это будет выглядеть следующим образом:

awk 'NR == 1, /LastHeaderLine/ { next } { print }' myinputfile > myoutputfile 

где NR == 1 верно для первой линии, /LastHeaderLine/ соответствует вашей последней строке заголовка. Оператор запятой допускает следующую функцию: {next} огонь для всех предложений в диапазоне двух регулярных выражений. В этом случае он переходит к следующей строке ввода без дальнейшей работы. Для всех других входных строк он будет выводить строки на стандартный вывод, который можно перенаправить с помощью>.

20

Как и для ответа Avi, но без включения линии с «LastHeaderLine».

sed -e '1,/LastHeaderLine/d' 
+0

Это намного чище, чем мое :-) – Avi 2008-10-13 10:25:29

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