2014-10-09 3 views
-3

У меня есть текстовый файл, выглядящий примерно так:Удалить «одиночек» строки из текстового файла

>>>aaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaa 

>>>aaaaaaaaaaaaaaaaaaaaaaa 

>>>aaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaa 

>>>aaaaaaaaaaaaaaaaaaaaaaa 

>>>aaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaa 

т.е. файл, состоящий из «групп» с заголовками, начиная с >>>. Как вы можете видеть, некоторые группы пусты - состоят только из заголовка, и я бы хотел, чтобы они были удалены. Результат должен быть:

>>>aaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaa 

>>>aaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaa 

>>>aaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaa 

Есть ли удобный способ ее решения, предпочтительно с использованием стандартных BASh Tolls s.à AWK, SED, Grep, и т.д.?

Благодарим заблаговременно!

+3

& Что вы пробовали? – anishsane

ответ

1

Это должно сделать:

awk '/.+/ { if (h) {print h; c++; print}} 
    /^>>>/ {h=$0; c=0} 
    /^$/ { if (c>0) print; h=false}' 

Но в следующий раз, когда вы должны показать то, что вы пытались уже

+0

Спасибо! Это работает, достаточно изящно и ясно для меня, чтобы понять без дальнейшего объяснения (не нужно беспокоиться @anishsane). Что касается причин, по которым я не пробовал что-то, что я уже пробовал, я полный noob на awk и использовал его только для простого манипулирования столбцами и просто ничего не мог придумать. – brtk

1
awk '{if (split($0,a,"\n")>1)print}' RS= ORS=$'\n\n' test.txt 
+1

После того, как вы обновили вопрос о своих попытках кодирования, прокомментируйте этот ответ, чтобы я объяснил этот код. – anishsane

1

С СЭД Вы можете написать это:

sed -n '/^>>>/{h;n;/^$/!{H;g;p};d};/^>>>/!p;' file.txt 

или если вы уверены, что все блоки разделены двумя символами новой строки:

sed -n '/^>>>/{h;n;/^$/!{H;g;p};d};p;' file.txt