2014-01-26 5 views
1

Мне нужна помощь в написании следующего. Если текущая строка начинается с #STOP#, а предыдущая строка также начинается с "#STOP#", тогда просто распечатайте строку. Если текущая строка начинается с "#STOP#", а предыдущая строка также начинается с "MSG#", конкатенируйте предыдущую строку с текущей строкой.Объединение предыдущей строки с текущей строкой в ​​соответствии с условием

входного файла:

#STOP# |package1| function1 
#STOP# |package2| function2 
#MSG# |package3| SQL1 
#STOP# |package4| MapperBean 
#MSG# |package3| SQL2 
#STOP# |package4| MapperBean 
#STOP# |package4| MapperBean 
#STOP# |package5| ActionItem 

Желаемый результат:

#STOP# |package1| function1 
#STOP# |package2| function2 
#STOP# |package4| MapperBean #MSG# |package3| SQL1 
#STOP# |package4| MapperBean #MSG# |package3| SQL2 
#STOP# |package4| MapperBean 
#STOP# |package5| ActionItem 

ответ

4

Один из способов с awk:

$ awk '$1=="#MSG#"{msg=OFS $0;next}{print $0(msg?msg:"");msg=""}' file 
#STOP# |package1| function1 
#STOP# |package2| function2 
#STOP# |package4| MapperBean #MSG# |package3| SQL1 
#STOP# |package4| MapperBean #MSG# |package3| SQL2 
#STOP# |package4| MapperBean 
#STOP# |package5| ActionItem 
+0

Вы можете удалить скобки, но это может быть какой-то менее читаемым. '{print $ 0, msg? msg:" "; msg =" "}' – Jotne

+2

@ Заявление jotne становится двусмысленным ... 'Gawk' будет в порядке,' BSD awk' будет жаловаться. Более безопасный и читаемый с нулевой выгодой. –

+0

Ahh, приятно знать :) – Jotne

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