У меня есть этот файлAWK конкатенация не работает
*PADS2000*
*PART*
C1 C2012
C10 C2012
*NET*
*SIGNAL* B2B_12V
F1.2 TC1.1
CNB2.88 U2.1
*SIGNAL* DDR3_VREF1
U9.M8 U9.H1
U5.6 C24.1
*END*
, и я хочу, чтобы преобразовать его выглядеть следующим образом (имя сигнала списка и все подключенные имена part.pin в одной строке).
*SIGNAL* B2B_12V F1.2 TC1.1 CNB2.88 U2.1
*SIGNAL* DDR3_VREF1 U9.M8 U9.H1 U5.6 C24.1
Этот сценарий, который я написал, выглядит следующим образом.
BEGIN{print "========================="}
(d || f) && (/*SIGNAL*/ || /*END/) {print "HAHAHA : " xline}
/*SIGNAL*/{kept=$0; f = 1; xline=$0; next}
f {print kept; f = 0; d = 1; print; xline=xline " " $0; next}
d {print; xline=xline " " $0}
Выход такой.
=========================
*SIGNAL* B2B_12V
F1.2 TC1.1
CNB2.88 U2.1
CNB2.88 U2.1 AL* B2B_12V
*SIGNAL* DDR3_VREF1
U9.M8 U9.H1
U5.6 C24.1
U5.6 C24.1 NAL* DDR3_VREF1
*END*
Что не так? (Похоже, что строки перезаписываются каждый раз, когда они должны быть объединены.)
EDIT: Позже я обнаружил, что это работает так, как я хотел в Cygwin. у моей оболочки CentOS, похоже, есть что-то странное. Если я запустил его на Cygwin, он работает как внизу, как я ожидал. (Приду к моей проблеме оболочки, когда у меня есть время.)
$ awk -f why.awk in.dat
=========================
*SIGNAL* B2B_12V
U24.2 TC1.1
CNB2.88 U2.1
HAHAHA : *SIGNAL* B2B_12V U24.2 TC1.1 CNB2.88 U2.1
*SIGNAL* DDR3_VREF1
U9.M8 U24.H1
U5.6 C24.1
HAHAHA : *SIGNAL* DDR3_VREF1 U9.M8 U24.H1 U5.6 C24.1
*END*
Вам нужно только один оператор 'print' в вашем коде, который всегда выводит завершающий символ' \ n'. Остальное должно быть 'printf (...)', которые НЕ включают завершающий символ '\ n'. Удачи. – shellter
Регулярное выражение '/ * SIGNAL * /' является незаконным, так как * является метасимволом RE. Вам следует избегать *. '(/ \ * SIGNAL \ */||/\ * END /)' – cdarke
@cdarke, но/* SIGNAL * /, похоже, работает в awk. –