2015-09-16 4 views
0

Я хочу изменить порядок ввода следующей строкой, но я продолжаю получать ENDD на неправильной линии.Печать между двумя совпадениями с awk

awk '/output/ {printf $0":";flag=1;next} /ENDD/{flag=0;} flag {printf $0 "," ;}{if (flag==0)print}' file 

Вход:

exam1 
exam4 1 
output 
list2 
frame 3 
list 5 
ENDD 
col 1 
cal 2 
del 3 

Выход:

exam1 
exam4 1 
output:list2,frame 3,list 5,ENDD 
col 1 
cal 2 
del 3 

Желаемая Выход:

exam1 
exam4 1 
output:list2,frame 3,list 5 
ENDD 
col 1 
cal 2 
del 3 
+0

Попробуйте 'AWK«/ выход/{Printf $ 0 ":"; флаг = 1, следующий}/ENDD/{флаг = 0; печать "";} флаг {Printf $ 0 "";} {если (flag == 0) print} 'file' – luoluo

+0

Это оставляет дополнительную запятую после выхода: line. Это похоже на задание домашней работы в области компьютерных наук. Должны ли мы делать здесь домашнюю работу? – slobobaby

+0

@slobobaby, это не домашнее задание, это всего лишь часть большего скрипта, над которым я работаю. И если вы не в порядке с решением чужого домашнего задания, вы должны просто игнорировать его. Спасибо за ваши усилия. – user3437245

ответ

3

вы можете попробовать

awk ' /output/ { printf "%s:",$0; flag=1; next } 
     /ENDD/{ print ""; flag=0; } 
     flag>1 { printf ","; } 
     flag { printf "%s",$0; flag++ } 
     !flag' file 

вы получите

 
exam1 
exam4 1 
output:list2,frame 3,list 5 
ENDD 
col 1 
cal 2 
del 3 

редактировать: другое решение

awk -v ini=output -v end=ENDD ' 
    $0 ~ ini, $0 ~ end{ 
    printf ($0~ini? "%s:" : ($0~end? "\n%s\n" : (prev ~ ini? "%s" : ",%s"))), $0; 
    prev=$0; 
    next; 
    } 1' file 
+0

примечание: '! Flag' является ярлыком' {if (flag == 0) print} ' –

+2

Рекомендуется применять шаблон формата при использовании' printf' – Kent

+0

@Kent i добавлен шаблон формата 'printf', спасибо за отзыв –

0

Более простое решение (чем мой оригинал):

awk '/output/ {printf $0":";flag=1;idx=0;next} /ENDD/{printf last "\n";flag=0} flag {if (last) printf last ","; last=$0}{if (flag==0)print}' file 
0

Использование SED

sed '/output/{N;s/\n/:/;:1;N;/ENDD/!{s/\n/,/;b1}}' file 
+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10861801) –

+0

@LucaDetomi Каким образом? – 123

+0

Ответ должен содержать сведения о «почему», это может быть хорошим решением вопроса или, возможно, лучшим. Вы предоставили фрагмент кода, но никаких подробностей, чтобы пользователи могли понять, почему этот код будет работать. Я предлагаю вам предоставить более подробную информацию, комментирующую ваш код. –

2
$ cat tst.awk 
/ENDD/ { print rec; inRec=0 } 
inRec { rec = rec sep $0; sep="," } 
/output/ { rec=$0 ; sep=":"; inRec=1 } 
!inRec 

$ awk -f tst.awk file 
exam1 
exam4 1 
output:list2,frame 3,list 5 
ENDD 
col 1 
cal 2 
del 3 
Смежные вопросы