2010-04-16 6 views
8

Я не могу найти определенную строку, так как все они очень похожи, но мне хотелось бы что-то просто выбить первые 4 строки в файле.Как удалить первую строку в файле?

Они также имеют переменную длину. Я думал о perl, и все это кажется сложнее, чем я думал, но я хотел бы сделать это в Perl, AWK или командной оболочке, если это возможно.

Есть ли у кого-нибудь простой способ сделать это?

+2

Примечание: вместо файла 'destructive_process> tempfile; mv tempfile file' вы должны использовать файл 'destructive_process> tempfile && mv tempfile file'. '&&' вместо ';' предотвращает перезапись исходного файла, если есть ошибка, поскольку он выполняет только вторую часть, если первая часть завершается успешно. –

ответ

7

sed является самым простым. Чтобы удалить первую строку из файла, сделайте следующее:

sed '1d' file.txt 

Или, чтобы удалить первые четыре строки, сделайте следующее:

sed '1,4d' file.txt 
+0

Эх, это прекрасно! Спасибо всем, кто предложил sed (хотя -i не работает над этой версией) – Soop

+0

+1 'sed' часто работает быстрее, чем решения на основе' tail'. –

+0

Вы тестировали команду с большими строками перед публикацией? Хотя он не запрашивается, он не работает с линиями более 15 Мбайт. – user869097

1

Попробуйте это: sed -i 1d file

Общее правило:

Чтобы удалить n первые строки: sed '1,nd' file.txt
Например: sed '1,4d' file.txt удалить первые 4 строки

4
sed -i '1,4d' <filename> 

будет удалить первые четыре строки входного файла. (Если вы хотите, чтобы первая строка была удалена, вместо этого вы могли бы использовать '1d'.)

Флаг -i обозначает редактирование на месте, что означает, что входной файл также является выходным файлом, и, следовательно, изменения записываются обратно в исходный файл. Если вы предпочли бы, чтобы файл остался нетронутым, а измененное содержимое просто было написано на stdout, просто опустите -i.

Этот и многие другие sed 1-вкладыши можно найти в удобной ссылке здесь:

http://sed.sourceforge.net/sed1line.txt

-1

Поиск файла для четвертого «\ г \ п» или " \ n "и подстроки из этого индекса.

13
tail -n+2 filename 

Пропустить первую строку в filename и вывести ее на стандартный вывод. Опция -n+2 означает запуск вывода строк, начинающихся со второй строки.

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

+0

+1: Это решение намного лучше, чем мое. Я не знал, что вы можете передать что-то вроде '+ 3' на' -n'. –

1

Решение, которое не требует языка сценариев (например, AWK, СЭД, Perl и т.д.):

tail -n `expr \`cat FILE | wc -l\` - 1` FILE > FILE.new; mv FILE.new FILE 

Идея заключается в том, чтобы подсчитать количество строк в файле, а затем вычесть один, а затем передать результат к команде «хвост».

+0

Что такое 'кошка'? Просто сделайте 'wc' в файле напрямую. Кроме того, 'tail' понимает' -n + 5', который начинается с строки 5. – Svante

+0

Ах, я не знал, что вы можете передать '+ N' на ключ -n хвоста. Пожалуйста, см. Ответ Марка Rushakoffs для более приятного (и более эффективного) решения, чем мое. –

+0

Чтобы быть педантичным, он использует один скриптовый язык: shell script :) – rjh

5

пропустить первые 4 строки

$ awk 'NR>4' file >temp;mv temp file 

$ more +5 file >temp;mv temp file 

$ perl -i.bak -ne '$.>=4 && print' file 
+1

Если количество строк для удаления является переменной: 'awk -v n = $ num 'NR> n' file' –

2
perl -pe'1..4and$_=""' 

как эквивалент

sed 1,4d 

или

perl -ne'1..4or print' 

как эквивалент

sed -n '1,4!p' 

Вы можете использовать -i же, как и в sed.

+0

@daotoad: Я заметил, что триггер редко используется. Я заметил это даже для опытных разработчиков Perl. Может быть, документация выглядит сложной для первого взгляда. –

1

Использование файла :: Tie. Это прекрасно.

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