2015-02-18 2 views
2

У меня есть текстовый файл (скажем, файл)Использование СЭД выборочно удалять строки

Name 
aaa 
bbb 
ccc 
Name 
xxxx 
Name 
yyyy 
tttt 

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

sed '/Name/d' file 

удаляет все «Name».

Желаемая Ouput:

Name 
aaa 
bbb 
ccc 
xxxx 
yyyy 
tttt 

Можете ли вы предложить какие варианты я должен использовать?

+1

Сначала вы должны объяснить, как вы говорите «заголовок» кроме «содержания» ... –

+0

Заголовок - это первый раз, когда появляется строка «Имя». Это происходит несколько раз, потому что я объединил много меньших файлов, все из которых имеют заголовок «Имя» – Ssank

+0

, поэтому удалите первую строку из каждого файла, прежде чем объединять их. проще сделать это там, где вы знаете, что строка 1 является заголовком. как только они объединены, у вас нет НИКАКОГО способа рассказать, что такое заголовок, а также о том, что происходит с LOOK как заголовок. –

ответ

2

Используйте это:

sed '1!{/Name/d}' file 

Предыдущая команда применяется ко всем строкам, кроме первой строки.

+0

хорошо работает, спасибо – Ssank

+0

добро пожаловать. держите оператор '!' в виду. Он отрицает условные выражения в 'sed' – hek2mgl

2

Если вы знаете, что первый заголовок на первой линии, пропустите его так:

sed '1!{/Name/d}' infile 

Это означает, что шаблон должен применяться на всех линиях, кроме линии 1.

или другим способом вокруг:

sed -n '2,${/Name/d};p' infile 

Возможно, с awk:

awk '/Name/ && c++ == 0 || !/Name/' infile 

Выход во всех случаях:

Name 
aaa 
bbb 
ccc 
xxxx 
yyyy 
tttt 
2

Вы можете найти синтаксис AWK более интуитивным:

awk 'NR==1 || !/Name/' file 

выше просто говорит if it's line number 1 or the line doesn't include "Name" then print it

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